【问题标题】:sorting vector of vector of strings in C++C++中字符串向量的排序向量
【发布时间】:2011-10-30 04:14:22
【问题描述】:

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

#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... }

提前谢谢...

【问题讨论】:

  • 那么...您注释掉的排序代码是否损坏?还是您只是想让我们为您实现排序代码?
  • 你怎么知道vector<string>应该在另一个之前还是之后?
  • @SB:我不知道如何排序...
  • a 向量> 可以被认为是字符串的二维数组,或字符的 3d 数组。您希望如何排序?
  • @Bill:改变了字符串...

标签: c++ sorting vector


【解决方案1】:

好的:新的-更简单的答案,已经知道向量是可比的:

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

【讨论】:

  • 如何指定在哪一列排序?
  • 这将按第一列排序,然后是第二列,然后是第三列,依此类推。如果您想要特定列,请使用比尔的答案,或者如果您想要特定的顺序,请自定义我的第一个答案或比尔的答案.
  • std::greater&lt;std::vector&lt;std::string&gt;&gt; 后面缺少括号来实际构造函子。
【解决方案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?
  • @Ringo:这让课程变得更加复杂,但是是的。我将添加一个示例。
  • @Ringo:我添加了代码,以便比较对象知道它将与哪一列进行比较。这有意义吗?
【解决方案3】:

我将假设每个向量代表某种类型的记录,并从左到右比较内部字符串。显然 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
  • 你说得对,我没看错标志。但实际上,运算符是为向量重载的,就像运算符>一样,所以你可以使用std::greater或std::less(这将是默认值)
  • @Benjamin:看看那个!我从来不知道它是! msdn.microsoft.com/en-us/library/572x098y(v=VS.71).aspx
  • @Mooing Duck:谢谢,但我不明白一件事,您将参数发送到 std::sort 作为 const 对吗?那么它是如何修改data_var的呢?
【解决方案4】:

查看算法中的排序函数:

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

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

Click here for an example + docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多