我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题。我在用着istream_iterator
读书floats
s(或其他类型)来自 astd::istream
:
#include <iostream>
#include <iterator>
#include <algorithm>
int main() {
float values[4];
std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(), values);
std::cout << "Read exactly 4 floats" << std::endl; // Not true!
}
这读取所有可能的floats
s,直到 EOF 进入values
,其大小固定为 4,所以现在显然我想限制范围以避免溢出并准确读取/最多 4 个值。
使用更多“正常”迭代器(即 RandomAccessIterator),提供begin+4
还没有结束你会做的:
std::copy(begin, begin+4, out);
正好读取 4 个元素。
如何做到这一点std::istream_iterator
?显而易见的想法是将调用更改为std::copy
to be:
std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(std::cin)+4, values);
但是(可以预见的是)这不会编译,没有候选者operator+
:
g++ -Wall -Wextra test.cc
test.cc: In function ‘int main()’:
test.cc:7: error: no match for ‘operator+’ in ‘std::istream_iterator<float, char, std::char_traits<char>, long int>(((std::basic_istream<char, std::char_traits<char> >&)(& std::cin))) + 4’
有什么建议么?是否有正确的“STLified”pre-C++0x 方法来实现此目的?显然我could只需将其写为 for 循环,但我希望在这里了解一些有关 STL 的知识。我一半想知道虐待std::transform
or std::merge
等以某种方式实现此功能,但我不太明白如何做到这一点。