奇怪的错误而插入到C ++的std ::地图
-
16-09-2019 - |
题
我想一定值对插入到一个std ::地图。 在第一种情况下,收到的指针图,解除引用它,并使用标操作符分配一个值。即
(*foo)[index] = bar;
包含空值除了第(map.begin())项目在所有情况下的价值属性后来,当我尝试遍历集合,我返回键/值对。奇怪的是,如果我做通过地图的插入功能的插入,一切都很好,即:
foo->insert(std::pair<KeyType,ValueType>(myKey, myValue));
为什么会变成这样?是不是这两种方法功能上等同?我已经粘贴的下面实际代码的某些代码段用于上下文
...
typedef std::map<int, SCNode*> SCNodeMap;
...
void StemAndCycle::getCycleNodes(SCNodeMap* cycleNodes)
{
(*cycleNodes)[root->getId()] = root;
SCNode* tmp = root->getSucc();
while(tmp->getId() != root->getId())
{
// (*cycleNodes)[tmp->getId()] == tmp; // crashes (in loop below)
cycleNodes->insert(std::pair<int, SCNode*>(tmp->getId(), tmp));//OK
std::pair<int, SCNode*> it = *(cycleNodes->find(tmp->getId()));
tmp = tmp->getSucc();
}
// debugging; print ids of all the SCNode objects in the collection
std::map<int, SCNode*>::iterator it = cycleNodes->begin();
while(it != cycleNodes->end())
{
std::pair<int, SCNode*> p = (*it);
SCNode* tmp = (*it).second; // null except for it = cycleNodes->begin()
std::cout << "tmp node id: "<<tmp->getId()<<std::endl;
it++;
}
}
我所有的想法。有没有人有一个建议吗?
解决方案
在您的实际代码,您有:
(*cycleNodes)[tmp->getId()] == tmp;
此将不分配TMP到地图,而是将参考到地图创建一个空值(参见@Neil巴特沃斯) - 你已经==代替=。你想要的是:
(*cycleNodes)[tmp->getId()] = tmp;
其他提示
您应该知道,操作符[]为标准::地图将值插入地图如果在表达式中使用像这样,当一个不存在:
if ( amap[x] == 42 ) {
...
}
如果x的值不存在,一个将被创建并分配零由值类型默认构造函数创建的值,或内置类型。这是几乎从来没有你想要什么,你一般应避免使用操作符[]与地图。
您是否值类型赋值操作符?
看一看此参考。 []操作返回一个非const参考值。如果你的任务是错误的或以某种方式在一个意想不到的方式工作,这可能是原因。
在另一方面插入方法采用的值,并且它填充到地图中。 []运算符构造具有默认构造方法的对象,然后让你使用它的赋值操作符分配的东西给它。
不隶属于 StackOverflow