嘗試:
int main()
{
std::deque<std::string> mydeque;
std::ifstream myifstream("test.txt");
std::string line;
while(std::getline(myifstream, line)
{
mydeque.push_back(line);
}
}
如果是每行一個字就可以簡化爲:
int main()
{
std::deque<std::string> mydeque;
std::ifstream myifstream("test.txt");
// Note: istream_iterator<T> uses std::istream& operator>>(std::istream&, T&) to
// read data from the stream. If `T` is a std::string this means it will
// read a single space separated word.
std::copy(std::istream_iterator<std::string>(myifstream),
std::istream_iterator<std::string>(),
std::back_inserter(mydeque)
);
}
如果每行包含多個單詞和要使用背面插入,那麼你需要定義一個用於讀取可用於迭代器的對象中的整行的類:
struct Line
{
std::string data;
operator std::string const&() const {return data;}
friend std::istream& operator>>(std::istream& s, Line& dst)
{
return std::getline(s, dst.data);
}
};
int main()
{
std::deque<std::string> mydeque;
std::ifstream myifstream("test.txt");
std::copy(std::istream_iterator<Line>(myifstream),
std::istream_iterator<Line>(),
std::back_inserter(mydeque)
);
}
或者我們可以只使用構造器:
int main()
{
std::ifstream myifstream("test.txt");
std::deque<std::string> mydeque(std::istream_iterator<Line>(myifstream),
(std::istream_iterator<Line>()));
// Note: Extra brace required around second iterator here
// This is to avoid the problem with the `Most Vexing Parse`
// Which would otherwise make this a function declaration
}
你應該更喜歡'std :: back_inserter'來顯式聲明'back_insert_iterator'。 –
pmr
2012-03-15 11:25:04
注意,而不是在迭代器的聲明中使用'decltype',你可以用'的std :: back_inserter(mydeque)' - 這是一個函數模板,並推斷出類型爲您服務。你可以直接將它傳遞給你的函數,或者用'auto'聲明變量,使你的代碼更具可讀性。 – 2012-03-15 11:27:13