如何使用私有比较器返回std :: set

时间:2009-04-03 14:19:13

标签: c++ stl

我想编写一个返回std :: set自定义对象的(C ++)方法。但是,我不想暴露插入对象时使用的比较器,因此我将其设为私有类。 我创建这样的集合:

std::set<some_class, some_class_comparator> return_object;

现在我想返回集合,所以它必须像这样(在返回时隐式):

(const std::set<some_class>) return_object;

这是编译器抱怨的地方。有没有办法将带有比较器的可变集转换为不可变的<?p>

非常感谢,

霍尔格

6 个答案:

答案 0 :(得分:4)

  

有没有办法施放一个可变的集合   与比较器到一个不可变的   无?

不,因为

std::set<some_class, some_class_comparator>

std::set<some_class>

完全是不同的,不相关的类型。模板只是模板 - 一种指定在编译之前如何生成类型的方法。在第二种情况下,比较器是std :: set随附的默认比较器。

有没有令人信服的理由some_class_comparotor需要私密?它可能是它自己的独立实体吗?是不是只是你不想污染你班级的公共界面?

答案 1 :(得分:1)

我不这么认为。 AFAIK std::set<some_class>只是std::set<some_class, std::less<some_class> >的简写,因此无法根据需要转换该集。

我建议将这些项目转移到其他数据结构(例如矢量)中,该数据结构将保持当前项目的顺序而不需要比较器。

答案 2 :(得分:1)

您最好的解决方案是这样的:

class MyClass
{
    class some_class_comparator;
public:
    typedef std::set<int, some_class_comparator> ReturnSet;
    ReturnSet myMethod();
    // ...
private:
    class some_class_comparator
    {
    public:
        bool operator< (MyClass& m) {return true;}
    };
};

//later...
MyClass::ReturnSet s = my_class_instance.myMethod();

答案 3 :(得分:0)

这是两种不同的类型std ::&lt;类型,比较器&gt;和std :: set&lt;类型,DefaultComparator&gt;。

答案 4 :(得分:0)

您希望隐藏来自调用者的实现细节,这听起来像虚拟函数,听起来像模板。我想首先,你需要问问自己,这真的很重要吗?如果是这样,请将您的类隐藏在IOpaqueSet接口后面。当然,没有其他STL操作可以对它起作用。

答案 5 :(得分:0)

STL带有许多内置类,但它也是一个可扩展的框架。如果定义了:: own :: immutable_set,并且定义了迭代器,则其他STL算法可以使用它。 immutable_set<T>将被定义为围绕可变std::set<T, comparator<T> >的精简const包装器(支持不同比较器所需的一些模板魔法,因为它们导致不同的类型)。 immutable_set<T>::iterator::operator++会转发std::set<T>::iterator::operator++等。