实现结构的向量和具有指向结构的指针的映射

时间:2014-03-25 10:18:25

标签: c++ pointers stl

我有3个数据结构:一个队列节点(struct),一个vector队列节点和一个map,其中一个键作为字符串,指向队列节点的指针。它们的定义如下:


队列节点:

struct QNode{
    int32_t index;
    int32_t count;
};

载体:

vector<QNode> n;

地图:

map<string, QNode*> QueuePointerMap;

每当我创建一个节点时,我将其插入到向量中并将指针存储到刚刚在地图中创建的节点,并将该键作为唯一字符串。我使用以下代码来执行此操作:

n.push_back(QNode());           
int insertIndex = n.size();
n[insertIndex-1].index = index-1;       
n[insertIndex-1].count = 1;
cout << "***************************\n";
cout << "Insert index: " << insertIndex << "\n"; 
cout << "n[insertIndex -1].index: " << n[insertIndex -1].index << "\n";
cout << "n[insertIndex -1].count: " << n[insertIndex -1].count << "\n";                     
cout << "***************************\n";
QueuePointerMap[uniqStr] = &(n[insertIndex-1]);
cout << "Address of N: " << &(n[insertIndex-1]) << "\n\n";

每当我在向量中插入一个节点时,它就会正确地存储在向量和地图中,但是在插入新节点后我遇到了问题。每当我在向量(和地图)中插入一个新值时,如果我尝试获取以前的值,我得到的值与存储的值不同。我使用以下代码来检索我的值:

map<string, QNode*>::iterator it1;
it1=QueuePointerMap.find(uniqStr);
if(it1 == QueuePointerMap.end()){
    cout << "\n Not Found \n";
}
else{
    QNode * n1 = it1->second;
    cout << "Value of N1: " << n1 ;
    cout << "\t Index: "<< (n1->index) << "\n Count: " << (n1->count) << "\n";
}

我不明白为什么我得到不同的索引和计数值。我想我在插入时做错了但我无法弄清问题是什么。我真的很感激,如果有人帮助我理解并解决这个问题。感谢。

1 个答案:

答案 0 :(得分:1)

每当你在向量中插入一个新值时,向量可能会或可能不会重新组织它的内部结构(将对象重定位到不同的内存位置等等),所以你从向量元素中获得的旧指针可能或者可能没有效果......

http://www.cplusplus.com/reference/vector/vector/push_back/说:

  

如果发生重新分配,则与容器相关的所有迭代器,指针和引用都将失效。