在c++中对字符串的向量进行排序

sorting vector of vector of strings in C++

本文关键字:向量 排序 字符串 c++      更新时间:2023-10-16

我有麻烦弄清楚,如何排序字符串向量的向量,这里是测试代码。

<>之前 #include <iostream> #include <vector> #include <boost/algorithm/string.hpp> int main(int argc, char** argv) { std::vector <std::vector <std::string> > data_var; std::vector <std::string> temp; std::string str1 = "1,hello3,temp2"; std::string str2 = "2,hello2,temp1"; std::string str3 = "3,hello1,temp3"; boost::split(temp, str1, boost::is_any_of(",")); data_var.push_back(temp); boost::split(temp, str2, boost::is_any_of(",")); data_var.push_back(temp); boost::split(temp, str3, boost::is_any_of(",")); data_var.push_back(temp); // sorting code here... } 之前

好了:新的更简单的答案,知道向量是可比较的:

//sorting code here...
std::sort(data_var.begin(), data_var.end(), std::greater<std::vector<std::string>>());

如果您只想根据第二列进行排序,那么您只需要提供一个自定义比较操作符。一种方法是:

struct StringListCompare
{
  bool operator()(const vector<string>& lhs, const vector<string>& rhs)
  {
    // what do we do if lhs or rhs don't have two elements?
    if (lhs.size() < 2 || rhs.size() < 2)
    {
      // ?
    }
    else
    {
      return lhs[1] < rhs[1];
    }
  }
} StringListComparer;
int main()
{
  // ...
  sort(data_var.begin(), data_var.end(), StringListComparer);
}

编辑:如果你在运行时才知道你要排序的列,你可以在排序对象中编码:

class StringListCompare
{
public:
  explicit StringListCompare(int column) : m_column(column) {}
  bool operator()(const vector<string>& lhs, const vector<string>& rhs)
  {
    // what do we do if lhs or rhs don't have (m_column + 1) elements?
    return lhs[m_column] < rhs[m_column];
  }
private:
  int m_column;
};

请注意,我们添加了一个构造函数,该构造函数接受它将要作用的列。你可以这样使用:

  // We set it up so the columns are 0-based:
  StringListCompare compare_column_0(0), compare_column_1(1), compare_column_2(2);
  cout << "Original:n" << data_var << endl;
  sort(data_var.begin(), data_var.end(), compare_column_2);
  cout << "Sorted on column 2:n" << data_var << endl;
  sort(data_var.begin(), data_var.end(), compare_column_1);
  cout << "Sorted on column 1:n" << data_var << endl;
  sort(data_var.begin(), data_var.end(), compare_column_0);
  cout << "Sorted on column 0:n" << data_var << endl;

如果你不想,你甚至不需要创建本地变量:

  sort(data_var.begin(), data_var.end(), StringListCompare(2));
  cout << "Sorted on 2, no local sort variable:n" << data_var << endl;

[Code at ideone]

假设每个向量代表某种类型的记录,并从左到右比较内部字符串。显然,sorter()代码很容易替换。您应该在代码的某个地方添加一个sorter()函数,并将其传递给std::sort算法。

bool sorter(const std::vector<std::string>& left, const std::vector<std::string>& right)
{
    //go through each column
    for(int i=0; i<left.size() && i<right.size()) {
        // if left is "more" return that we go higher
        if( left[i] > right[i])
            return true;
        // if left is "less" return that we go lower
        else if (left[i] < right[i])
            return false;
    }
    // if left is longer, it goes higher
    if (left.size() > right.size())
        return true;
    else //otherwise, left go lower
        return false;
 }
 int main() {
     std::vector <std::vector <std::string> > data_var;
     //...
     //sorting code here...
     std::sort(data_var.begin(), data_var.end(), sorter);
     //...
 }

查看算法中的排序函数:

template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

点击这里查看示例+ docs