STLイテレーターを使用して発生した問題を示すために、最小限の作業例を作成しました。私は:からs(または他のタイプ)istream_iterator
を読み取るために使用しています:floats
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
これは、EOFが固定サイズの4になるまで、すべての可能なsを読み取りますvalues
。したがって、オーバーフローを回避するために範囲を制限し、正確に/最大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
いましたが、その方法がよくわかりません。