我有一个结构
struct dbdetails
{
int id;
string val;
};
我需要一个C ++中的数据结构,它可以保存具有排序功能的结构变量。可能吗?我在看vector,它可以保存结构变量,但是我无法根据id对它进行排序,因为它是一个结构成员。有什么建议?
答案 0 :(得分:6)
您需要一个自定义仿函数来比较您的尝试。这应该可以解决问题:
#include <algorithm>
#include <vector>
// try is a keyword. renamed
struct sorthelper : public std::binary_function<try_, try_, bool>
{
inline bool operator()(const try_& left, const try_& right)
{ return left.id < right.id; }
};
...
std::vector<try_> v;
// fill vector
std::sort(v.begin(), v.end(), sorthelper());
...
如果您有任何后续问题,请随时询问。你是否拥有Stroustrup书?
编辑:对Matteo的建议:
struct try_
{
int id;
string val;
bool operator<(const try_& other) const
{return id < other.id;}
}; // no s here plz.
...
std::vector<try_> v;
// fill vector
std::sort(v.begin(), v.end());
...
答案 1 :(得分:4)
您可以使用std::map
。它们按键排序,因此您可以这样做:
std::map<int, std::string> myStuff;
这是一张地图,其中int
为关键字,std::string
为关键字。当您遍历地图时,您会发现它会按键自动排序。
请注意,此解决方案不再需要struct
。如果您绝对需要struct
中的数据(可能与某些外部库接口),您可以随时根据需要将数据从map
复制到struct
。
答案 2 :(得分:1)
您可以拥有vector
struct
个,然后将其排序为:
std::sort(vectStruct.begin(), vectStruct.end(), &vectStructSort);
bool vectStructSort(Try const& lhs, Try const& rhs) { // try is keyword.
return lhs.id < rhs.id;
}
答案 3 :(得分:1)
这取决于您对数据容器的要求。 您可能会发现一个有用的集合(在Stl中,Set是一个Sorted Associative Container来存储Key类型的对象)。甚至是哈希集或排序数组。
如果您知道需要对元素进行排序,那么最好使用已排序的容器,而不是每次需要时对其进行排序。
答案 4 :(得分:1)
所有订购的容器(std::set
,std::map
,std::multiset
,std::multimap
)都是有序的。非有序容器(std::list
,std::vector
,std::deque
)可以通过使用std::sort
(vector,deque)提供比较函数或通过向成员提供比较器来订购方法(清单)。
这一切归结为你真正需要的东西。如果您需要始终对元素进行排序,那么排序容器可能比修改容器和求助更有效。另一方面,如果始终对容器进行排序不是必需的,但是能够修改元素,那么您可能更喜欢向量。排序容器将键维护为常量对象,因为修改键会破坏排序不变量。
在某些情况下,容器需要始终进行排序,但在初始化阶段后不会更改。在这种情况下,初始化后排序的非排序容器可以没问题。
答案 5 :(得分:0)
您可以根据结构成员对矢量进行排序。你只需要一个自定义比较器。