随机访问和更新stl :: set

时间:2010-12-30 09:10:12

标签: c++ stl set

我正在使用stl :: set来保持元素在插入时排序。我的问题是关于随机访问。如果我有一个复杂的类(例如难以初始化),我发现它很容易插入,因为我将less运算符定义为类。但如果关键是类本身,我如何才能访问该类?有了find()?我需要初始化一个复杂的类才能找到我的班级?

所以我的问题是:当元素是难以初始化的复杂类时,如何随机访问set元素?

由于

5 个答案:

答案 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_typestd::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;
    }
}