1

こんにちは私はベクトルの構造である文字列のベクトルを持っています: ベクトルの名前はベクトルです

"key:  abc 165.123.34.12", 
"key:  bca 1.1.1.1", 
"key1: bac 3.3.3.3"

2 番目のフィールド (abc、bac、bac) に従ってベクトルを並べ替えたい

私のコードは;

 bool sort_function(string& str1,string& str2) {

     string nick1,nick2,nick1_ignore,nick2_ignore;

     stringstream ss1(str1) 

     ss1>> nick1_ignore >> nick1;

     stringstream ss2(str2) 

     ss2>> nick2_ignore >> nick2;

     return (nick1<nick2);

 }


     sort(vector.begin(), vector.end(),sort_function);

しかし、エラーで始まる長いエラーが発生し、

  error: no match for ‘operator>>’ in ‘std::basic_stringstream<char>

UPDATE: エラーは tl_algo.h です: 関数 '_RandomAccessIterator std:..

更新:修正されました。エラーは関数宣言にあります const 文字列を使用する必要があります

4

2 に答える 2

6

関数テンプレートのオーバーロードoperator>>(std::basic_istream &, std::string &)constそのistreamパラメーターではないため、一時的に呼び出すことはできません。

プリミティブの読み取り時にメンバーを呼び出すことができるため、これは紛らわしいです。operator>>int

代わりに、あなたは書く必要があります

stringstream ss1(str1); ss1 >> nick1_ignore >> nick1;

最初に no-op マニピュレータを読み取るか、no-op メソッドを呼び出して左辺値参照を取得することで、これを回避することもできます。

stringstream(str1).ignore(0) >> nick1_ignore >> nick1;

C++11 ではoperator>>istreamパラメーターと右辺値参照を使用してフリーのオーバーロードを提供することで、これを修正しています。

于 2012-08-29T10:35:10.057 に答える
0

こんな用途には使いませんstd::istringstream。行が実際にあなたが説明した形式を持っている場合、次の行に沿った何か:

class CompareFields
{
    int myStart;
    int myEnd;
public:
    CompareFields( int start, int end )
        : myStart( start )
        , myEnd( end )
    {
    }
    bool operator()( std::string const& lhs, std::string const& rhs ) const
    {
        assert( lhs.size() >= myEnd && rhs.size() >= myEnd );
        return std::lexicographical_compare( lhs.begin() + myStart,
                                             lhs.begin() + myEnd,
                                             rhs.begin() + myStart,
                                             rhs.begin() + myEnd );
    }
};

必要なのは次のとおりです。

std::sort( v.begin(), v.end(), CompareFields( 6, 9 ) );

フィールドを別の方法で定義したい場合。たとえば、空白の場合CompareFields、正しい動作をするように再定義する必要があります。

于 2012-08-29T11:46:36.900 に答える