向量元素是否保证有序
Are vector elements guaranteed to be in order?
我知道,拥有指向向量元素的指针是个坏主意,因为在扩展时,所涉及的内存地址会发生变化,从而使指针无效。但是,如果我只是使用一个整数来保存我想要访问的元素的索引号,该怎么办?这会随着矢量的大小而无效吗?我想的是这样的:
#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;}
否,当矢量展开时,索引号当然不会无效。如果你删除了以前的元素,它们就会失效(从某种意义上说,你不再在一个不变的索引中找到相同的元素)
vector: 3 5 1 6 7 4
这里是vector[2] == 1
。但如果您擦除vector[1]
(5),然后再擦除vector[2] == 6
。
我认为你的问题的标题和你似乎在问的问题并不匹配。根据定义,没有向量可以保证排序,所以元素不会"有序"。
此外,如果发生重新分配(即,当向量的大小超过其容量时),所有迭代器和对向量元素的引用在插入时将无效。否则,插入点之前的迭代器和引用将不会无效(参见C++11标准第23.3.6.5/1段)。
存储索引只会受到潜在的逻辑失效的影响:如果您将元素插入到向量中,位置在您正在索引的元素之前,则您正在索引中的元素将向右移动一个位置,并且同一索引现在将指代不同的元素;同样,如果您在索引的位置之前擦除了一个元素,则索引的元素将在位置上向左移动,并且您的索引现在可能指向一个越界的位置。
否,当展开向量时,索引号不会无效。由于您声明向量容器对象不是指针vector<someClass>
而不是vector<someClass*>
,因此您的指向元素也将被保留。
这不应该,因为系统只会分配更多的内存,然后进行memcopy。
顺序应保留在std::vector STL模板中。
是的,如果删除元素,排序就会改变。但是,如果要进行大量删除,请使用不同的数据结构,如链表。
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何知道地图中的最后一个元素是否被删除?
- 检查 TinyXML 中的元素是否存在
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?
- 在迭代期间添加到 std::unordered_set(或 unordered_map)中的元素是否会在迭代期间访问?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 通过引用访问矢量元素是否会降低C++的空间复杂性?
- 检查HTML 5视频元素是否正在获取帧
- 在c++中,如何检查一个数组的元素是否也是另一个数组中的元素
- 是否有更有效的方法来检查元素是否在给定的区间内
- 如何检查数组的 3 个元素是否具有相同的值
- 整数指针数组的元素是否可以指向整数数组?
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 写入多维矢量子级中的元素是否安全?
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- 如何确定向量的元素是否交替为符号?
- 如何查看矢量中的所有元素是否相同?
- 从标准容器中移动元素是否合法?
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?