私はの入力を持っていますしかし、これはコンパイルされません:error: no match for 'operator>>'
、おそらく演算子のオーバーロードが必要なので。STLコピー、ペア、ベクトルおよびインサータ
これは、std::vector
から継承した独自のクラスを作成してから演算子をオーバーロードする必要があることを意味しますか?
標準のベクタークラスではなく、自分のクラスを使用しないようにしたいと思います。
私はの入力を持っていますしかし、これはコンパイルされません:error: no match for 'operator>>'
、おそらく演算子のオーバーロードが必要なので。STLコピー、ペア、ベクトルおよびインサータ
これは、std::vector
から継承した独自のクラスを作成してから演算子をオーバーロードする必要があることを意味しますか?
標準のベクタークラスではなく、自分のクラスを使用しないようにしたいと思います。
問題はstd::vector
ではなく、std::istream_iterator
です。理由は、std::pair
には、逆シリアル化演算子が定義されていないからです。
引き続きstd::vector
とstd::back_insert_iterator
を使用できますが、独自の入力イテレータを定義する必要があります。値のペアを読み取るもの。
あなたのペアにoperator>>
を定義することを推奨する人もいますが、これは信頼性の低い手法です。 <algorithm>
と<iterator>
を含める前に定義されている演算子によって異なります。
ああ、+1!あなたはあなたの最後の段落を説明できますか? – gsamaras
@gsamaras - [これが理由です](https://stackoverflow.com/questions/46811833/why-does-stdlesseigenvectorxd-fail-to-compile/46812491#46812491)。あなたのポストへのコメントで提供されたコードは、namesapce stdを再オープンします。新しい機能の定義を追加することはできません。それはUBです。 – StoryTeller
あなたはプロキシオブジェクトを通してそれをコピーすることができます:
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
struct proxy
{
friend auto operator>>(std::istream& is, proxy& prox) -> std::istream&
{
is >> std::get<0>(prox.target);
is >> std::get<1>(prox.target);
return is;
}
operator std::pair<int, char>() const {
return target;
}
std::pair<int, char> target;
};
int main(void) {
std::vector<std::pair<int, char>> v;
std::copy(std::istream_iterator<proxy>(std::cin),
std::istream_iterator<proxy>(),
std::back_inserter(v));
for(auto pair: v)
std::cout << pair.first << std::endl;
return 0;
}
良い答え。私は、何が過負荷になるべきかについての私の印象が間違っていると述べたなら、それを受け入れるだろう(それはイテレータでありベクトルではない)。受け入れられた答えがコンパクトになるように。 – gsamaras
あなたが '' <<ペア 読み出すために[これ等がかもしれ](http://rextester.comための独自の実装を定義する必要があります/ ATHMY25752) – P0W
ああ@ P0W、イテレータの問題ではなく、ベクトルではありません! – gsamaras
Nah私は 'std'名前空間でやっている/示唆することに少しでも躊躇しています。もう少し多くの努力が必要な可能性がある、より良い選択肢があります。 – P0W