13

我想知道我们是否可以对预先创建的集合进行排序。当我第一次创建集合 s_p2 时,我使用不同的元素 point.getLength() 进行排序。但在用户输入后,我想根据 x 值 point.getX() 对项目进行排序。我该怎么做?

似乎 set 容器没有排序功能。我被建议使用矢量。但是集合只能存储独特的元素。

Q1:如何根据条件对集合进行排序

Q2:如果 set 无法做到这一点,那么哪个 STL 容器是最佳选择,我如何对容器中的元素进行排序。

4

3 回答 3

18

你不能诉诸 a set,它如何排序是特定类型的一部分set。一个给定set的有一个固定的集合顺序,不能改变。

set您可以相对容易地使用相同的数据创建一个新的。set只需根据新标准创建一个新的排序。

如果您想set在同一代码中使用这两个 s,则必须抽象对底层set.

现在,如果您正在执行罕见的读取和修改,则使用vector手动排序的 a 通常是一个更好的主意。您可以使用std::unique-erase成语删除重复项。

于 2012-11-14T18:57:41.380 回答
9

std::set以排序方式存储其成员。.begin()如果您从到遍历集合.end(),您将获得一个排序的项目列表。

如果您不喜欢默认的排序条件,您可以提供第二个模板参数std::set<>

于 2012-11-14T18:54:33.503 回答
3

您可以拥有两套并使它们保持同步或将一套复制到另一套。

#include <iostream>
#include <set>

using namespace std;

struct AB
{
   AB(int a,int b) : _a(a),_b(b) {}

   int _a;
   int _b;
};

struct byA
{
    bool operator () (const AB& lhs, const AB& rhs)
    {
          return lhs._a <= rhs._a;
    }
}; 

struct byB
{
    bool operator () (const AB& lhs, const AB& rhs)
    {
       return lhs._b <= rhs._b;
    }
}; 

typedef set<AB,byA> ByA;
typedef set<AB,byB> ByB;
typedef ByA::const_iterator ByAIt;
typedef ByB::const_iterator ByBIt;

void getByB(const ByA &sA,ByB &sB)
{
   for(ByAIt iter=sA.begin(); iter!=sA.end();++iter) {
      const AB &ab=*iter;
      sB.insert(ab);
   }
}

int main(int argc, const char **argv)
{
   ByA sA;
   sA.insert(AB(3,6));
   sA.insert(AB(1,8));
   sA.insert(AB(2,7));

   ByB sB;
   getByB(sA,sB);

   cout << "ByA:" << endl;
   for(ByAIt iter=sA.begin(); iter!=sA.end();++iter) {
      const AB &ab=*iter;
      cout << ab._a << "," << ab._b << " ";
   }
   cout << endl << endl;

   cout << "ByB:" << endl;
   for(ByBIt iter=sB.begin(); iter!=sB.end();++iter) {
      const AB &ab=*iter;
      cout << ab._a << "," << ab._b << " ";
   }
   cout << endl;
   return 0;
}

程序返回:ByA 1,8 2,7 3,6

由B:3,6 2,7 1,8

于 2015-04-19T18:19:00.137 回答