我理解指向向量元素的指针是一个坏主意,因为在扩展时,所涉及的内存地址将发生变化,从而使指针无效。但是,如果我只是使用一个包含我想要访问的元素的索引号的整数呢?随着向量增长,这会失效吗?我在想什么看起来像这样:
#include <vector>
class someClass{
string name
public: string getName(){return name;}
};
vector<someClass> vObj;
int currIdx;
string search;
cout<<"Enter name: ";
cin>>search;
for(int i=0; i<vObj.size(); i++){
if(vObj[i].getName()==search)
currIdx = i;}
答案 0 :(得分:5)
不,当向量扩展时,索引号当然不会失效。如果擦除前一个元素,它们将无效(在某种意义上,你不再在常量索引处找到相同的元素):
vector: 3 5 1 6 7 4
此处vector[2] == 1
。但是如果你删除vector[1]
(5),然后删除vector[2] == 6
。
答案 1 :(得分:2)
我认为你问题的标题和你似乎要问的内容并不匹配。根据定义,没有向量保证被排序,因此元素将不是“按顺序”。
此外,如果发生重新分配(即当向量的大小超过其容量时),所有迭代器和对向量元素的引用将在插入时时失效。否则,插入点之前的迭代器和引用将不会失效(参见C ++ 11标准的第23.3.6.5/1段)。
存储索引只会受到潜在的逻辑失效的影响:如果您将元素插入到之前位置的向量中,那么元素就是索引将向右移动一个位置,同一索引现在将引用不同的元素;同样,如果你在索引的位置之前擦除一个元素,你索引的元素将在左侧位置移动 - 你的索引现在可能指的是一个超出界限的位置。
答案 2 :(得分:0)
它不应该,因为系统将简单地分配更多的内存,然后进行记忆。
订单应保存在std :: vector STL模板中。
是的,如果删除元素,顺序将会改变。但是,如果您要进行大量删除操作,请使用其他数据结构,例如链接列表。
答案 3 :(得分:0)
不,展开矢量时索引号不会失效。由于您声明向量容器对象不是指针vector<someClass>
而不是vector<someClass*>
,因此您的指向元素也将被保留。