C++ std::映射运算符的一致性[]

C++ std::映射运算符的一致性[],c++,c++11,C++,C++11,我正在试图解决代码中的一个bug,似乎我不能真正理解标准中对std::map::operator[]的要求,或者至少在我的编译器VS2013附带的STL中存在一些缺陷,仍然在尝试不同的工具集 我可能误用的std::map定义为提供一个Compare类型作为其第三个模板参数,使我使用的一些关键对象与其他一些对象等效。就我对标准23.2.4.2中给出的等效性定义的理解而言:如果:!问题是,傻瓜不是描述严格弱序,而是描述偏序 有关详细信息,请参阅 例如: Foo a {1, 'a'}; Foo b {

我正在试图解决代码中的一个bug,似乎我不能真正理解标准中对std::map::operator[]的要求,或者至少在我的编译器VS2013附带的STL中存在一些缺陷,仍然在尝试不同的工具集

我可能误用的std::map定义为提供一个Compare类型作为其第三个模板参数,使我使用的一些关键对象与其他一些对象等效。就我对标准23.2.4.2中给出的等效性定义的理解而言:如果:!问题是,傻瓜不是描述严格弱序,而是描述偏序

有关详细信息,请参阅

例如:

Foo a {1, 'a'};
Foo b {2, 'b'};
Foo c {1, 'c'};
FooLess comp;
assert(comp(a, b) && comp(b, c)); // Should imply comp(a, c)
assert(!comp(a, c));              // But doesn't due to only partial ordering
只要映射或搜索的所有键都具有唯一的.cs,比较器就可以工作。

问题在于,傻瓜并不描述严格的弱排序,而是描述偏序

有关详细信息,请参阅

例如:

Foo a {1, 'a'};
Foo b {2, 'b'};
Foo c {1, 'c'};
FooLess comp;
assert(comp(a, b) && comp(b, c)); // Should imply comp(a, c)
assert(!comp(a, c));              // But doesn't due to only partial ordering

只要映射或搜索的所有键都具有unique.cs,您的比较器就可以工作。

这就是我的bug。可悲的是,我很清楚这个要求,只是没有找到合适的时间。有没有关于如何使用等效钥匙的建议?这样我就能从a或b得到值?你的例子中的a和c?我意识到,如果唯一重要的是比较的话,我就不能这么做。@gius我们的onky规范,你想要的是等价的,不是严格的弱顺序的代码。将其更改为严格的弱顺序会改变其功能。我猜你想要的是地图中每个c中的一个,但是所有c都被找到了——不,查找和替换是相同的逻辑。用相等的距离自己寻找和挑选一个可能有用。@Yakk AdamNevraumont我没领会你的意思。该映射定义是在一个非常复杂的代码中,它依赖于模板来尽可能地声明。如果操作符==是正确的术语,我试图强制映射的行为就像它只是基于相等一样。简单的解决方法是切换到实际依赖它的std::unordered_映射。您也可以使用std::multimap,只需将不相关的部分保留在顺序之外,使其成为具有等效项的完整顺序。@GUI Ok,那么我的猜测是错的。不管怎样,你必须描述你希望人们能够解决你的问题。我们所拥有的只是不符合您要求的坏代码。让它做你想做的事需要知道你想要什么。有无限的可能改变你的代码。这就是我的错误。可悲的是,我很清楚这个要求,只是没有找到合适的时间。有没有关于如何使用等效钥匙的建议?这样我就能从a或b得到值?你的例子中的a和c?我意识到,如果唯一重要的是比较的话,我就不能这么做。@gius我们的onky规范,你想要的是等价的,不是严格的弱顺序的代码。将其更改为严格的弱顺序会改变其功能。我猜你想要的是地图中每个c中的一个,但是所有c都被找到了——不,查找和替换是相同的逻辑。用相等的距离自己寻找和挑选一个可能有用。@Yakk AdamNevraumont我没领会你的意思。该映射定义是在一个非常复杂的代码中,它依赖于模板来尽可能地声明。如果操作符==是正确的术语,我试图强制映射的行为就像它只是基于相等一样。简单的解决方法是切换到实际依赖它的std::unordered_映射。您也可以使用std::multimap,只需将不相关的部分保留在顺序之外,使其成为具有等效项的完整顺序。@GUI Ok,那么我的猜测是错的。不管怎样,你必须描述你希望人们能够解决你的问题。我们所拥有的只是不符合您要求的坏代码。让它做你想做的事需要知道你想要什么。更改代码的可能性是无限的。