【发布时间】:2019-11-04 22:14:35
【问题描述】:
我创建了以下纯测试程序来说明问题:
#include <iostream>
#include <iterator>
#include <algorithm>
int main() // Test program. Not for real life solution. Just for demonstrating the question
{
int odd{ 0 }, even{ 0 }, nValues{ 0 };
std::cout << "Check and count odd and even numbers\n\nHow many numbers to check? Enter a value: ";
std::cin >> nValues;
std::for_each_n(std::istream_iterator<int>(std::cin), nValues, [&](const int i) {if ((i % 2) == 0) ++even; else ++odd; });
std::cout << "\nYou entered '" << even << "' even values and '" << odd << "' odd values\n\n";
return 0;
}
如果我输入n,则将读取n+1 值。
cppreference 解释了istream_iterator:
实际的读取操作是在迭代器递增时执行的,而不是在它被取消引用时执行的。当迭代器构造时,第一个对象被读取。取消引用仅返回最近读取的对象的副本。
如果我想将std::istream_iterator和std::for_each_n()一起使用,我想我遇到了std::for_each_n()的实现问题,可能根据cppreference实现(我知道这只是一个例子)喜欢
template<class InputIt, class Size, class UnaryFunction> InputIt for_each_n(InputIt first, Size n, UnaryFunction f) { for (Size i = 0; i < n; ++first, (void) ++i) { f(*first); } return first; }
因此,为了检查f() 是否已被调用n 次,它递增i AND 输入迭代器first。在我的演示示例中,这会导致对std::cin 的额外阅读。所以,它永远无法为我的测试程序工作。 std::copy_n() 的实现方式似乎有所不同。当我想将std::cin 中的n 值读入vector 时,以下工作。喜欢
std::vector<int> v(3);std::copy_n(std::istream_iterator<int>(std::cin), 3, v.begin());
那么,我想知道为什么会有不同的行为? std::istream_iterator 和 std::for_each_n() 的组合可以工作吗?
使用<algorithm> 库的替代解决方案是什么?
【问题讨论】:
标签: c++ algorithm iterator inputstream