【发布时间】:2012-08-30 17:28:36
【问题描述】:
假设我有这样的代码:
#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 不会影响 任何不变量或不会做任何事情来使顺序无效 集合中的元素?
如果唯一的办法是使用另一个容器,例如vector,如何 我是否在检查是否有一个时在排序位置插入一个新值 已经存在?
【问题讨论】:
-
如果您可以使用,我很确定 Boost.MultiIndex 可以解决您的问题。
-
@GManNickG -- 不幸的是,我的雇主不会使用它。非常感谢,还是一样。
-
与您的问题无关,但您的
operator<意味着您可以拥有a、b、c这样!(a < b) && !(b < a) && !(b < c) && !(c < b),但仍然是a < c。 -
欣赏另一篇帖子的链接,@interjay——我在发帖前进行了搜索,但没有找到您交叉引用的那个。也就是说,我的问题与其说是“为什么”(我理解),不如说是“如何”。此外,那里和这里(均由 James McNeillis!)接受的答案明显不同。
标签: c++ invariants const-iterator stdset