繁体   English   中英

插入C ++ std :: map时出现奇怪的错误

[英]Weird bug while inserting into C++ std::map

我正在尝试将一些值对插入到std :: map中。 在第一种情况下,我收到一个指向地图的指针,将其取消引用,然后使用下标运算符分配一个值。

(*foo)[index] = bar;

稍后,当我尝试遍历集合时,我返回了键/值对,在所有情况下,除了第一项(map.begin())之外,其中的value属性都为null。 奇怪的是,如果我通过地图的插入功能进行插入,那么一切都很好,即:

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 Butterworth)-您使用==而不是=。 您想要的是:

(*cycleNodes)[tmp->getId()] = tmp;

您应该知道,如果在这样的表达式中使用std :: map的operator [],则该值将插入映射中:

if ( amap[x] == 42 ) {
   ...
}

如果值x不存在,则将创建一个值,并为其分配由值类型默认构造函数创建的值,对于内置类型,则将其分配为零。 这几乎永远不是您想要的,因此通常应避免在地图上使用operator []。

您的值类型是否具有赋值运算符?

看看这个参考 []运算符返回对该值的非常量引用。 如果您的分配错误或以某种意外的方式起作用,则可能是原因。

另一方面,insert方法接受一个值并将其填充到映射中。 []运算符使用默认构造函数构造一个对象,然后让我们使用其赋值运算符为其分配内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM