Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中字符串向量的排序向量+;_C++_Sorting_Vector - Fatal编程技术网

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

C++ C+中字符串向量的排序向量+;,c++,sorting,vector,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::str

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


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

提前感谢…

查看算法中的排序功能:

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

template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
模板无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator);
模板无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator,比较comp);

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

     //...
 }
bool分拣机(常数std::vector&left,常数std::vector&right)
{
//浏览每一列
for(int i=0;i right.size())
返回true;
否则//否则,左下
返回false;
}
int main(){
std::矢量数据;
//...
//排序代码在这里。。。
std::sort(数据变量begin()、数据变量end()、分类器);
//...
}

如果只希望根据第二列进行排序,则只需提供一个自定义比较运算符。实现这一点的一种方法是:

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);
}
StringListCompare结构
{
布尔运算符()
{
//如果lhs或rhs没有两个元素,我们该怎么办?
如果(左S.size()<2 | |右S.size()<2)
{
// ?
}
其他的
{
返回lhs[1]
编辑:如果在运行时之前不知道要对哪个列进行排序,可以在排序对象中对其进行编码:

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;
};
类StringListCompare
{
公众:
显式StringListCompare(int列):m_列(列){}
布尔运算符()
{
//如果lhs或rhs没有(m_列+1)元素,我们该怎么办?
返回lhs[m_列]
请注意,我们添加了一个构造函数,该构造函数将对哪个列执行操作。您可以这样使用它:

  // 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;
//我们将其设置为基于0的列:
StringListCompare\u column\u 0(0)、compare\u column\u 1(1)、compare\u column\u 2(2);

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

//sorting code here...
std::sort(data_var.begin(), data_var.end(), std::greater<std::vector<std::string>>());
//这里的排序代码。。。
std::sort(data_var.begin()、data_var.end()、std::greater());

所以。。。您注释的排序代码是否已损坏?或者你只是想让我们为你实现排序代码?你怎么知道一个
向量应该在另一个之前还是之后?@SB:我不知道如何对它排序…向量可以被认为是二维字符串数组,或三维字符数组。您希望如何排序?@Bill:更改了字符串…您的“sorter”比较器与默认比较器等效。@Benjamin Lindley:我很确定默认比较器为std::less,默认为T::operator您是对的,我没有正确读取符号。但是事实上,操作符<对于vector是重载的,就像操作符>,所以你可以使用std::greater,或者std::less(这是默认值)@Benjamin:看看这个!我从来不知道是这样@Mooing Duck:谢谢,但我不明白一件事,您正在将参数发送到std::sort as const,对吗?那么它如何修改数据_var?我如何指定对哪列进行排序?这将按第一列、第二列、第三列等进行排序。如果您需要特定列,请使用Bill的答案,或者如果您需要特定顺序,自定义我的第一个答案或比尔的答案。
std::greater
之后缺少括号,无法实际构造函子。我是否可以将列作为参数传递给StringListComparer?@Ringo:这会使类更复杂,但是的。我将添加一个示例。@Ringo:我添加了代码,以便比较对象知道它将与哪个列进行比较。这有意义吗?
//sorting code here...
std::sort(data_var.begin(), data_var.end(), std::greater<std::vector<std::string>>());