根据字符串中的索引对c ++中的字符串进行排序

时间:2012-08-29 10:31:08

标签: c++

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

"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字符串

2 个答案:

答案 0 :(得分:6)

函数模板重载operator>>(std::basic_istream &, std::string &)const参数上不是istream,因此您无法暂时调用它。

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

相反,你必须写

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

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

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

C ++ 11通过提供免费operator>>的重载以及istream参数和右值引用来解决此问题。

答案 1 :(得分: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才能做正确的事。