我正在使用stl :: set来保持元素在插入时排序。我的问题是关于随机访问。如果我有一个复杂的类(例如难以初始化),我发现它很容易插入,因为我将less运算符定义为类。但如果关键是类本身,我如何才能访问该类?有了find()?我需要初始化一个复杂的类才能找到我的班级?
所以我的问题是:当元素是难以初始化的复杂类时,如何随机访问set元素?
由于
答案 0 :(得分:3)
1)为您的类创建一个特殊的“lightweigt”初始化程序,以创建对象的“ligtweight”版本,并将这些“轻量级”对象仅用作访问地图的键
2)使用地图而不是集合。
我更喜欢第二种解决方案。
答案 1 :(得分:2)
Set不支持随机访问迭代器。如果您想要其他方式来比较对象(不会使用运算符<),您必须执行以下操作
1)第一种方式
bool compareFunciton(const setElementClass& lhs,const setElementClass& rhs)
{
//return true if lhs's key is smaller than rhs and false at other case
}
set<setElementClass,compareFunction> someSet;
2)或者您可以使用函数类而不是像这样的函数
class compareClass
{
public:
bool opreator()const setElementClass& lhs,const setElementClass& rhs)
{
//return true if lhs's key is smaller than rhs and false at other case
}
};
compaerClass comp;
set<setElementClass,comp> someSet;
另外我认为你必须看看功能标题。在那里你可以找到一些你可以在feauture中使用的功能类。 http://www.cplusplus.com/reference/std/functional/
答案 2 :(得分:2)
我认为不可能:正如您已经注意到的那样,std::set<>::find
成员函数需要const key_type &
(std::set
中的value_type
与std::map
相同)。
如果您构造对象的代价很高,那么您可能应该更好地使用{{1}}(也是一个已排序的容器),可能值类型为(智能)指针。
答案 3 :(得分:1)
你必须使用一套吗?
您可能最好使用地图并为复杂类生成键(可能是数字索引或字符串),然后使用复杂类的对象作为值。
确保您的密钥遵循与值相同的排序规则。 std :: map实现为树,因此它还会根据键保持项目的排序。
答案 4 :(得分:1)
你只需要定义一个这样的结构:
#include <set>
using std::binary_function;
using std::set;
struct very_complex
{
int x, y;
};
struct less : public binary_function<very_complex, very_complex, bool>
{
bool operator() (very_complex const& lho, very_complex const& rho)
{
if (lho.x != rho.x)
return lho.x < rho.x;
return lho.y < rho.y;
}
}