1

假设我有这样的代码:

#include <set>
#include <math.h>

typedef int OtherTypes;

struct MyType
{
    double Field1;
    OtherTypes MoreFields;

    MyType(double blah) :
        Field1(blah)
    {
    }

    bool operator < (const MyType &That) const
    {
        // Does not use any other member besides Field1
        return ( fabs(Field1 - That.Field1) > 1e-6 &&
                 Field1 < That.Field1 );
    }

};

int main()
{
    std::set<MyType> foo;
    std::pair< std::set<MyType>::iterator,
               bool > inchk = foo.insert(MyType(1.0));

    OtherTypes SomeVal = 1;
    if ( inchk.second )
        inchk.first->MoreFields = SomeVal; // error

}

我如何向编译器保证编写 MoreFields 不会影响任何不变量或不会做任何事情来使集合中元素的顺序无效?

如果唯一的办法是使用另一个容器,例如向量,我如何在排序位置插入一个新值,同时检查一个是否已经存在?

4

2 回答 2

4
  • 声明MoreFieldsmutable,或

  • const_cast删除常量的inchk.first表达式,或

  • 封装MoreFields在返回非 const 引用的 const 限定访问器中。

于 2012-08-30T17:33:02.207 回答
0

我认为您想使用地图而不是集合。

于 2012-08-30T17:44:37.220 回答