我正在尝试将一些值对插入到std :: map中。 在第一种情况下,我收到一个指向地图的指针,取消引用它并使用下标运算符来赋值。即
(*foo)[index] = bar;
稍后,当我尝试迭代集合时,我返回的键/值对在除了第一个(map.begin())项之外的所有情况下都包含null属性。奇怪的是,如果我通过map的插入函数进行插入,一切都很顺利,即:
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++;
}
}
我完全没有想法。有人有建议吗?
答案 0 :(得分:12)
在您的实际代码中,您有:
(*cycleNodes)[tmp->getId()] == tmp;
这不会将tmp分配到地图中,而是引用到地图中创建一个空值(参见@Neil Butterworth) - 你有==而不是=。你想要的是:
(*cycleNodes)[tmp->getId()] = tmp;
答案 1 :(得分:4)
你应该知道std :: map的operator []会在地图中插入一个值,如果在这样的表达式中使用它时不存在:
if ( amap[x] == 42 ) {
...
}
如果值x不存在,将创建一个值并分配值类型默认构造函数创建的值,或者为内置类型分配值。这几乎不是你想要的,你通常应该避免使用带有map的operator []。
答案 2 :(得分:2)
您的值类型是否有赋值运算符?
看看this reference。 []运算符返回值的非const引用。如果你的作业是错误的或以某种方式以某种意外的方式起作用,这可能就是原因。
另一方面,insert方法接受一个值并将其填充到地图中。 []运算符使用默认构造函数构造一个对象,然后让你使用它的赋值运算符为它分配东西。