我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题。我istream_iterator
用来从 a 读取floats
s (或其他类型)std::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
为:
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 方法来实现这一目标?显然我可以把它写成一个 for 循环,但我想在这里学习一些关于 STL 的东西。我有一半想知道滥用std::transform
等std::merge
以某种方式实现此功能,但我不太明白如何做到这一点。