2017-10-23 8 views
1

私はの入力を持っていますしかし、これはコンパイルされません:error: no match for 'operator>>'、おそらく演算子のオーバーロードが必要なので。STLコピー、ペア、ベクトルおよびインサータ

これは、std::vectorから継承した独自のクラスを作成してから演算子をオーバーロードする必要があることを意味しますか?

標準のベクタークラスではなく、自分のクラスを使用しないようにしたいと思います。

+0

あなたが '' <<ペア 読み出すために[これ等がかもしれ](http://rextester.comための独自の実装を定義する必要があります/ ATHMY25752) – P0W

+0

ああ@ P0W、イテレータの問題ではなく、ベクトルではありません! – gsamaras

+0

Nah私は 'std'名前空間でやっている/示唆することに少しでも躊躇しています。もう少し多くの努力が必要な可能性がある、より良い選択肢があります。 – P0W

答えて

2

問題はstd::vectorではなく、std::istream_iteratorです。理由は、std::pairには、逆シリアル化演算子が定義されていないからです。

引き続きstd::vectorstd::back_insert_iteratorを使用できますが、独自の入力イテレータを定義する必要があります。値のペアを読み取るもの。

あなたのペアにoperator>>を定義することを推奨する人もいますが、これは信頼性の低い手法です。 <algorithm><iterator>を含める前に定義されている演算子によって異なります。

+0

ああ、+1!あなたはあなたの最後の段落を説明できますか? – gsamaras

+1

@gsamaras - [これが理由です](https://stackoverflow.com/questions/46811833/why-does-stdlesseigenvectorxd-fail-to-compile/46812491#46812491)。あなたのポストへのコメントで提供されたコードは、namesapce stdを再オープンします。新しい機能の定義を追加することはできません。それはUBです。 – StoryTeller

1

あなたはプロキシオブジェクトを通してそれをコピーすることができます:

#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; 
} 
+0

良い答え。私は、何が過負荷になるべきかについての私の印象が間違っていると述べたなら、それを受け入れるだろう(それはイテレータでありベクトルではない)。受け入れられた答えがコンパクトになるように。 – gsamaras

関連する問題