【发布时间】:2011-05-10 17:00:11
【问题描述】:
我构建了一个最小的工作示例来展示我在使用 STL 迭代器时遇到的问题。我正在使用istream_iterator 从std::istream 中读取floatss(或其他类型):
#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!
}
这会读取所有可能的 floatss,直到 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 等以某种方式实现此功能,但我不太明白该怎么做。
【问题讨论】:
-
+1 是一个简短的自包含完整示例(请参阅 sscce.org)。
-
@Rob - 我一直使用术语 MWE 来表示最小的工作示例,但这是一种很好的描述方式,尤其是在该 URL 上使用有用的文本。
标签: c++ stl iterator istream-iterator