C ++中字符串向量的排序向量

rda*_*mon 3 c++ sorting vector

我很难弄清楚如何对字符串向量的向量进行排序,这是测试代码。


#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...
}
Run Code Online (Sandbox Code Playgroud)

提前致谢...

Moo*_*uck 5

好了:新的简单答案,因为已经知道向量是可比的:

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

  • 您实际上在`std :: greater &lt;std :: vector &lt;std :: string &gt;&gt;`之后构造函数时缺少括号。 (2认同)

Bil*_*ill 2

如果您只想根据第二列进行排序,那么您只需要提供一个自定义比较运算符。这样做的方法是:

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果您直到运行时才知道要对哪一列进行排序,您可以在排序对象中对其进行编码:

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;
};
Run Code Online (Sandbox Code Playgroud)

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

  // 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;
Run Code Online (Sandbox Code Playgroud)

如果您不想,甚至不需要创建局部变量:

  sort(data_var.begin(), data_var.end(), StringListCompare(2));
  cout << "Sorted on 2, no local sort variable:\n" << data_var << endl;
Run Code Online (Sandbox Code Playgroud)

[ideone 上的代码]