对排序向量的子集进行排序

时间:2011-11-30 21:43:05

标签: c++ sorting vector

我正在尝试找出在多个条件下对数组进行排序的最佳方法。我想对数组进行排序,然后根据第一个标准对该数组的子集进行排序。

示例:

说我们有数据:{ ("cat", 2), ("dog", 4), ("cat", 1), ("dog", 3) }

我们首先按照字符串的字母顺序排序:

{ ("cat", 2), ("cat", 1), ("dog", 4), ("dog", 3) }

然后我们按照数字的递增顺序对两个子集(一组猫和一组狗)进行排序:

{ ("cat", 1), ("cat", 2), ("dog", 3), ("dog", 4) }

另外,我正在使用具有以下标题的递归quicksort方法:

void quickSort(vector<Type*>, int left, int right)

其中left和right是应该对向量进行排序的边界索引。

我应该在排序方法本身添加代码还是应该以某种方式再次调用排序方法?

4 个答案:

答案 0 :(得分:2)

如果您将数据存储为vector<pair<string, int> >,那么您只需使用std::sort(vec.begin(), vec.end());即可,因为pair的{​​{1}}已经使用了operator<的两个部分对象进行排序。

答案 1 :(得分:2)

通常,您希望使用自定义比较器进行排序。

struct Foo {
  std::string name;
  int count;
  struct Less {
    bool operator()(const Foo &lhs, const Foo &rhs) const {
      if ((int c = lhs.name.compare(rhs.name)) != 0)
        return c < 0;
      return lhs.count < rhs.count;
    }
  };
};

std::vector<Foo> foos;
// ...
std::sort(foos.begin(), foos.end(), Foo::Less());

如果您不能只使用一个自定义运算符,则可以使用稳定的排序。

正如Mark所指出的,std::sort 是一种稳定的排序。相反,您需要使用std::stable_sort

您希望按重要性递增的顺序对它们进行独立排序。因此,您按数字排序,然后按字符串排序。

struct Foo {
  std::string name;
  int count;
  struct NameLess {
    bool operator()(const Foo &lhs, const Foo &rhs) const {
      return lhs.name.compare(rhs.name) < 0;
    }
  };
  struct CountLess {
    bool operator()(const Foo &lhs, const Foo &rhs) const {
      return lhs.count < rhs.count;
    }
  };
};

std::vector<Foo> foos;
// ...
std::stable_sort(foos.begin(), foos.end(), Foo::CountLess());
std::stable_sort(foos.begin(), foos.end(), Foo::NameLess());

您显然更喜欢第一种,但后者可以派上用场,以保持组合和/或运行时可配置算法的简单化。

供参考:

cplusplus.com C++ : Reference : STL Algorithms : stable_sort

cplusplus.com C++ : Reference : STL Algorithms : sort

答案 2 :(得分:2)

你可能会超载你的&lt;然后你可以使用vector.unique()然后使用vector.sort()

答案 3 :(得分:2)

在您的情况下,您需要一个自定义比较器,因为您正在混合数据类型,您无法比较您的标准比较器只能比较相同的数据类型,并且不知道您要排序的标准。