首页 > 试题广场 >

STL中的哪种结构在增加成员时可能会引起原有成员的存储位置发

[单选题]
STL中的哪种结构在增加成员时可能会引起原有成员的存储位置发生改变
  • map;
  • set;
  • list;
  • vector;
推荐
【正确答案】D
【解析】vector 是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问,由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:
1. 完全弃用现有的内存空间,重新申请更大的内存空间;
2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;
3. 最后将旧的内存空间释放。
所以 vector 增加成员时可能引起原有成员的存储位置发生改变。
map 和 set 是使用红黑树实现的,增加成员可能会改变红黑树的结构,但是不会改变原有成员的存储位置。
list 是使用双向链表实现的,增加成员不会改变原有成员的存储位置。
 
vector知识点讲解】
更多C++基础专业知识讲解,点击链接即可查看
https://www.nowcoder.com/link/zxyl-cpp30
编辑于 2021-11-17 15:35:08 回复(1)

vector(向量): 是一种序列式容器,事实上和数组差不多,但它比数组更优越。一般来说数组不能动态拓展,因此在程序运行的时候不是浪费内存,就是造成越界。而 vector 正好弥补了这个缺陷,它的特征是相当于可拓展的数组(动态数组),它的随机访问快,在中间插入和删除慢,但在末端插入和删除快。

特点 
  • 拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取,即 [] 操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了 vector 的效率。
  • 对头部和中间进行插入删除元素操作需要移动内存,如果你的元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高。
  • 对最后元素操作最快(在***入删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要。


编辑于 2020-08-18 11:05:51 回复(0)
vector会重新申请一块空间
发表于 2018-03-22 22:46:48 回复(0)
出题不严谨,已提交。底层红黑树实现的容器新数据插入树会导致树变形的。
发表于 2018-04-11 11:51:24 回复(1)
D
vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,

不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身

的一套机制不断扩充自身的容量。

vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续

的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空

间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
编辑于 2021-11-17 15:35:08 回复(0)
答案 D 
vector是用动态数组实现的,当容量不够时会扩容,导致存储位置变化,其他是用链表实现的,所以不会出现扩容的问题
发表于 2015-01-11 16:16:31 回复(1)
增加成员,比如说插入,vector是数组实现的,所以内存连续,中间插入一个元素会引起插入点后元素储存位置的变化。而其他三个容器是由链表等实现的,增加元素不会引起其他元素位置变化,只需要改变相应指针就可以,
发表于 2020-08-01 11:07:52 回复(0)

红黑树插入新数据,会改变红黑树的结构,但是红黑树的存储位置不会发生变化


发表于 2018-11-23 09:53:01 回复(0)
答案:D
Vector类底层使用数组存储的,数组有固定大小,当增加成员时数组已满,则重新申请一块更大的连续内存空间,将原数组的元素复制过去,然后销毁原数组,这个移动的过程就造成了原有成员存储位置的改变
发表于 2015-01-26 18:41:57 回复(0)
vector存在动态扩容机制,当发生动态扩容时,原来的数据存储位置会发生改变。
发表于 2017-01-15 17:11:45 回复(0)
vector容满时,如果再添加元素,那么需要重新申请更大位置的空间,就会让存储位置发生变化。
发表于 2023-03-18 11:09:51 回复(0)
vector是一种动态数组,内存连续,当有新元素插入而内存空间不足时。会自动进行扩充,即按照现有容量的一倍进行增长,寻找新的足够大的内存空间,将所以元素复制过来,并销毁之前的内存空间,达到动态扩充的效果
编辑于 2021-01-28 09:39:21 回复(0)
vector是用动态数组实现的,当容量不够时会扩容,导致存储位置变化
发表于 2018-05-24 09:29:03 回复(0)
在vector中间增加成员会移动后面成员的位置。或者初始分配的空间被用完了的时候会整个全移动位置
发表于 2018-03-04 00:07:48 回复(0)
vector是用动态数组实现的,当容量不够时会扩容,导致存储位置变化,其他是用链表实现的,所以不会出现扩容的问题
发表于 2017-11-04 20:09:15 回复(0)
为啥啊 map set底层红黑树有可能发生旋转的啊,原位置也发生改变
发表于 2017-07-19 15:16:38 回复(2)
关于vector里面的具体的内存分配,推荐给大家一片博文http://blog.csdn.net/meetings/article/details/46604741
这里边举得那个例子特别细致
发表于 2015-09-07 20:22:35 回复(0)