我想知道是否可以对预先创建的集合进行排序。当我首次创建集合s_p2时,我使用不同的元素point.getLength()进行了排序,但是在用户输入后,我想根据x值point.getX()对项进行排序。我该怎么做?
似乎set容器没有排序功能。建议使用vector。但是set只能存储唯一元素。
问题1:如何根据条件对set进行排序?
问题2:如果set无法实现排序,则哪种STL容器最好,并且如何对其中的元素进行排序。
无法对set
进行排序,因为排序方式是该特定set
类型的一部分。给定的set
具有固定的顺序,无法更改。
您可以相对容易地创建一个具有相同数据的新set
。只需创建一个基于新标准排序的新set
即可。
如果要在同一代码中使用两个set
,则必须抽象访问底层set
。
现在,如果您进行的是罕见的读取和修改操作,则手动排序的vector
通常是更好的选择。您可以通过使用std::unique
-erase
习惯用法来删除重复项。
std::set
以有序方式存储其成员。如果您从.begin()
到.end()
遍历集合,将得到一个排序后的项目列表。
如果您不喜欢默认的排序标准,则可以为std::set<>
提供第二个模板参数。
std::set<>
中的项目复制到不同的容器中,例如带有不同比较模板参数的std::set
。 - Robᵩ你可以拥有两个集合并使它们保持同步,或者复制一个集合到另一个集合。
#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
ByB: 3,6 2,7 1,8
v.erase(std::unique(v.begin(), v.end()), v.end());
将删除重复项。 - Mike Seymouroperator==
进行比较。你可能需要传递一个谓词(predicate),以便只消除那些在排序方面等价的内容(!(a<b) && !(b<a))
。 - Yakk - Adam Nevraumont, v.end()
-- 它可以编译通过,但不会做任何有意义的事情,但可能会通过一些手动测试。 - Yakk - Adam Nevraumont