1

嗨,我有字符串向量,即向量的结构:向量的名称是向量

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

我想根据第二个字段(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>

更新:错误是 tl_algo.h:在函数 '_RandomAccessIterator std:..

更新:它是固定的。错误在函数声明中我必须使用 const string

4

2 回答 2

6

函数模板重载operator>>(std::basic_istream &, std::string &)不在constistream参数上,因此您不能临时调用它。

这很令人困惑,因为您可以operator>>在读取原语时调用该成员,例如int.

相反,你必须写

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

您也可以通过首先读取无操作操纵器或调用无操作方法来获取左值引用来解决此问题:

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

C++11 通过提供operator>>带有istream参数右值引用的 free 重载来解决这个问题。

于 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 回答