在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_iter
和 eof
迭代器的 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 的频率。
在 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_iter
和 eof
迭代器的 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 的频率。