我想一定值对插入到一个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参考值。如果你的任务是错误的或以某种方式在一个意想不到的方式工作,这可能是原因。

在另一方面插入方法采用的值,并且它填充到地图中。 []运算符构造具有默认构造方法的对象,然后让你使用它的赋值操作符分配的东西给它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top