在while循环之前用istream_iterator初始化一个vector,这个操作会影响后面的循环吗?

Initializing a vector with istream_iterator before while loop, does this operation affect following loop?

在 while 循环之前添加 vector<string> vec(file_iter, eof); 时,该循环只会 运行 一次。为什么?

istream_iterator<string> file_iter(in), eof;
map<string, size_t> word_cout;
vector<string> vec(file_iter, eof);
while (file_iter != eof)
{
 auto ret = word_cout.insert(make_pair(*file_iter, 1));
 if (ret.second == false) ++ret.first->second;
 ++file_iter;
}

此处构造:

vector<string> vec(file_iter, eof);

file_itereof 迭代器的 copy 传递给向量构造函数,然后滥用前者将内容加载到向量中。在这样做的同时,不断读取底层流 in 直到遇到流错误或 EOF。一旦发生这种情况,流将处于错误或 eof 状态,读取完成,向量完成填充。

然后,回到你的下一行代码:

while (file_iter != eof)

记住,在它的副本被用于 运行 到 eof 的流之前,它仍然是原始的 file_iter。该迭代器的初始质数仍然完好无损,但是一旦您推进它 (++file_iter),就会发现流位于 eof,迭代器将如此设置,现在 while-condition 将比较为假。

如果要加载向量 构建频率图,请对后者使用向量迭代器,或者更好的是,使用 ranged-for 循环:

istream_iterator<string> file_iter(in), eof;
map<string, size_t> word_cout;
vector<string> vec(file_iter, eof);
for (auto const& s : vec)
    ++word_count[s];

现在 vec 包含您文件中的每个单词, 您的地图包含 said-same 的频率。