首先,这里有一个类似的问题:Unusual std::map runtime error。
但是因为那里没有真正的解决方案,所以我想再问一遍,因为我真的很固执和无知。
我的代码如下:
struct MyObj{
//constructor
MyObj(){}
std::map<std::string, std::string> m_fooMap;
bool operator==(const MyObj& other)
{
if (m_fooMap.size() != other.m_fooMap.size())
return false;
std::map<std::string, std::string>::const_iterator i, j;
i = m_fooMap.cbegin();
j = other.m_fooMap.cbegin();
for (; i != m_fooMap.cend(), j != other.m_fooMap.cend(); ++i, ++j)
{
if(i->first.empty() || j->first.empty())
continue;
if (i->first != j->first)
return false;
if (i->second != j->second)
return false;
}
return true;
}
bool operator!=(const MyObj& other)
{
return !operator==(other);
}
};
struct AnotherObj{
std::map<std::string, MyObj> m_collectionOfObjs; //always guaranteed to contain atleast one entry
bool operator==(const AnotherObj &other) const
{
for (auto& objIt : m_collectionOfObjs)
{
auto findSeriesIt = other.m_collectionOfObjs.find(objIt.first);
if (findSeriesIt == other.m_collectionOfObjs.end())
return false;
//else found, see if the internal content is the same?
else
{
if (objIt.second != findSeriesIt->second)
return false;
}
}
//else
return true;
}
};
现在,我有一个std :: vector anotherObjVec; 我需要将向量中的项目相互比较。为此,我使用==运算符。
现在每次在随机实例上,即使输入数据相同,也似乎存在运行时错误。该错误指向“ xtree”文件中的以下代码。
_Nodeptr _Lbound(const key_type& _Keyval) const
{ // find leftmost node not less than _Keyval
_Nodeptr _Pnode = _Root(); //<------------ THIS line is where it points to
_Nodeptr _Wherenode = this->_Myhead; // end() if search fails
while (!this->_Isnil(_Pnode))
if (_DEBUG_LT_PRED(this->_Getcomp(), this->_Key(_Pnode), _Keyval))
_Pnode = this->_Right(_Pnode); // descend right subtree
else
{ // _Pnode not less than _Keyval, remember it
_Wherenode = _Pnode;
_Pnode = this->_Left(_Pnode); // descend left subtree
}
return (_Wherenode); // return best remembered candidate
}
我被困住了,不知道下一步该怎么做。我什至尝试像这样启动构造函数:
MyObj() : m_fooMap(std::map<std::string, std::string>()){}
使用C ++ 11,Visual Studio 2012(v110)
答案 0 :(得分:1)
您正在比较来自不同地图的迭代器:
auto findSeriesIt = other.m_collectionOfObjs.find(objIt.first);
if (findSeriesIt == m_collectionOfObjs.end())
return false;
findSeriesIt
来自other.m_collectionOfObjs
映射,但是您正在将其与m_collectionOfObjs
的末尾进行比较。应该是:
auto findSeriesIt = other.m_collectionOfObjs.find(objIt.first);
if (findSeriesIt == other.m_collectionOfObjs.end())
return false;
答案 1 :(得分:1)
您的单词
即使输入数据相同,也似乎存在运行时 错误。
因此,operator==
看起来应该在块末尾返回true,但是您的函数不会返回任何值(如果您的映射为空,则您的函数会到达没有return语句的块末尾) :
bool operator==(const MyObj& other)
{
if (m_fooMap.size() != other.m_fooMap.size())
return false;
std::map<std::string, std::string>::const_iterator i, j;
i = m_fooMap.cbegin();
j = other.m_fooMap.cbegin();
for (; i != m_fooMap.cend(), j != other.m_fooMap.cend(); ++i, ++j)
{
if(i->first.empty() || j->first.empty())
continue;
if (i->first != j->first)
return false;
if (i->second != j->second)
return false;
}
// ??? return is missing here
}
所以它是未定义的行为
(from):
返回值返回函数的末尾(main除外) 没有return语句是未定义的行为。
答案 2 :(得分:0)
i != m_fooMap.cend(), j != other.m_fooMap.cend()
使用逗号运算符,丢弃第一个操作数。它不会同时检查这两个条件,因此当i
等于结束迭代器时,以后可能会取消引用。您应该改用and
运算符:
(m_fooMap.cend() != i) and (other.m_fooMap.cend() != j);
答案 3 :(得分:0)
结果是未正确实例化地图。这发生在我身上,因为我正在使用std :: shared_ptr并将其存储在std :: vector中。然后遍历它,共享的ptrs之一就是nullptr。不知道为什么会这样,因为它是一个共享的ptr,并且它在向量中仍然应该保持引用计数不变,但是我只是更改了向量的迭代技术,现在就可以使用了。