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

6

我遇到了麻烦,无法弄清如何对一个字符串的向量进行排序,这是测试代码。


#include &ltiostream>
#include &ltvector>
#include &ltboost/algorithm/string.hpp>
int main(int argc, char** argv) { std::vector &ltstd::vector &ltstd::string> > data_var; std::vector &ltstd::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... }

提前感谢你...


所以... 你注释掉的排序代码有问题吗?还是你只是想让我们为你实现排序代码? - NG.
2
你如何确定一个 vector<string> 应该在另一个之前或之后? - Bill
@SB:我无法弄清如何对它进行排序... - rda3mon
1
一个vector<vector<string>>可以看作是一个二维的字符串数组,或者三维的字符数组。你希望以什么方式进行排序? - Mooing Duck
@Bill: 更改了字符串... - rda3mon
4个回答

8
好的:新的 -更简单的- 答案,从中学到向量是可比较的:
//sorting code here...
std::sort(data_var.begin(), data_var.end(), std::greater<std::vector<std::string>>());

我该如何指定按哪一列排序? - rda3mon
1
这将按第一列、第二列、第三列等排序。如果您想要特定的列,请使用Bill的答案,或者如果您想要特定的顺序,请自定义我的第一个答案或Bill的答案。 - Mooing Duck
2
你漏掉了括号,需要在 std::greater<std::vector<std::string>> 后面加上括号才能实际构造这个函数对象。 - ildjarn

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);
}

编辑:如果直到运行时才知道要按哪一列进行排序,您可以在排序对象中进行编码:
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]


我能否将列作为参数传递给StringListComparer? - rda3mon
@Ringo:这会让类变得更加复杂,但是没错。我会添加一个示例。 - Bill
@Ringo:我已经添加了代码,使比较对象知道它将与哪一列进行比较。这样说清楚了吗? - Bill

1
我假设每个向量表示某种类型的记录,并从左到右比较内部字符串。显然,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);

     //...
 }

@Benjamin Lindley:我相信默认的比较器是std::less,它默认使用T::operator<(const T&),但这个操作符在std::vector中没有重载。另外,我们要按降序排序(如果std::more适用于向量的话)。 - Mooing Duck
1
你说得对,我没有正确地阅读标志。但事实上,vector已经重载了operator<和operator>,因此你可以使用std::greater或std::less(后者是默认值)。 - Benjamin Lindley
@Benjamin:看看这个!我从来不知道它是这样的!http://msdn.microsoft.com/zh-cn/library/572x098y(v=VS.71).aspx - Mooing Duck
@Mooing Duck:谢谢,但是有一件事我不明白,你将参数作为const发送给std::sort,那么它如何修改data_var呢? - rda3mon
我能问一下,你能给我指一些解释std::sort函数的链接吗? 但不要是http://www.cplusplus.com/reference/algorithm/sort/。 - rda3mon
显示剩余4条评论

0

请查看算法中的排序函数:

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

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

点击此处查看示例和文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接