Mik*_*vic 14 c++ dictionary stl strict-weak-ordering
我有一些代码可以在VS 10.0中编译好但是在下面的Orders地图中插入一些项目后,我在Microsoft调试库中收到"invalid operator <"错误.我的较少运算符很简单,只需将char字符串比较为8字节的字符串.任何人都知道为什么我会收到此错误?
typedef struct MY_orderID_t
{
char orderID[8];
} MY_orderID_t;
struct std::less<MY_orderID_t>
{
bool operator()(const MY_orderID_t& k1, const MY_orderID_t& k2) const
{
for( int i=0; i < 8; i++ )
{
if( k1.orderID[i] < k2.orderID[i] )
return( true );
}
return( false );
}
};
std::map< MY_orderID_t, MY_order_t > Orders[5];
Run Code Online (Sandbox Code Playgroud)
tem*_*def 27
我相信这里的问题是你比较两个MY_orderID_t的方法不是严格的弱顺序,C++ STL所需的排序关系的类型.要成为严格的弱订单,您的less-than运算符必须具有以下四个属性:
现在,您的订购不遵守属性(2)或(3).
*首先,(2)违反以下规定:
(0, 4) < (2, 2)
(2, 2) < (0, 4)
Run Code Online (Sandbox Code Playgroud)
*其次,(3)被违反,因为
(0, 1) < (2, 0) < (-1, 1)
// but
(0, 1) < (-1, 1) // Fail
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,而不是使用您当前的比较,而是使用像这样的字典比较:
return std::lexicographical_compare(k1.orderID.begin(), k1.orderID.end(),
k2.orderID.begin(), k2.orderID.end());
Run Code Online (Sandbox Code Playgroud)
这种比较是严格的弱排序,默认情况下是所有STL容器使用的.切换到此比较遵循属性(1) - (4)并且应该使一切正常工作.
希望这可以帮助!
@templatetypedef告诉你当前版本有什么问题.
这是一个更易读的修复:
struct MY_orderID_type
{
char orderID[8];
bool operator<(const MY_orderID_type& other) const
{ return memcmp(orderID, other.orderID, 8) < 0; }
};
std::map< MY_orderID_type, MY_order_type > Orders;
Run Code Online (Sandbox Code Playgroud)
除了我目前没有看到的任何其他可能的错误之外,不允许使用此构造:
struct std::less<MY_orderID_t>
{ /**/ }
Run Code Online (Sandbox Code Playgroud)
std::less已经是一种类型,因此您不能将其重新定义为另一种类型。
| 归档时间: |
|
| 查看次数: |
6190 次 |
| 最近记录: |