C++ 中 vector 如何实现内存分配
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 中 vector 如何实现内存分配相关的知识,希望对你有一定的参考价值。
<<C++ primer中对顺序容器的内存分配是这样描述的,内容太多,简写一下:为了支持随机访问,vector中的元素采用顺序存放,即每一个元素紧挨着前一个元素进行存储。那么现在只有可能出现问题了,当内存中没有足够连续的空间去存放新插入来的元素怎么办,C++是这样处理的:重新分配内存空间,将原来旧的元素全部复制到新的存储空间中去,然后再插入新的元素。因此可以看出,如果内存不是特别充足或者内存中没有较大块的空闲空间的,向vector容器中插入元素可能会有相当大的CPU开销。其中最糟糕的情况是每次插入一个元素,程序要将所有的元素复制到一个新的内存块上去,当然对于这种情况c++作了一个折衷的处理:当我们插入元素时,如果老的内存块是连续空闲空间不够,则重新分配一块内存空间,内存空间的大小不是只比旧的内存空间大一个元素的大小,相反而是多分配几个元素空间大小,这样对于接下来的几个新插入元素做到有空间可以插入,这样之后使得vector的性能得到很大提高,不过这是一个折衷的办法。vector<int vec;for(int i = 0; i < 10; i++)vec.push_back(i);vector<int::iterator it = vec.begin();for(int i = 0; i < 5; i++)it++;cout<<&(*it)<< <<*it<<endl;it = vec.insert(it , 33);cout<<&(*it)<< <<*it<<endl;++it;cout<<&(*it)<< <<*it<<endl;行啦,我给出来吧,具体原因可能要你自己去分析了,其实从上面的解释可以看出原因003BB93C 33003BB940 5呵呵,是不是有点像数组的随机插入,要将插入点后的所有数据往后移动。这么说的话,可能没有用链表高效。不过根据C++ primer作者给出的解释,vector的实际使用效率要比list和deque要高一点。主要还是要看应用场景吧。 参考技术Avector有内存管理的机制,也就是说对于插入和删除,vector可以动态调整所占用的内存空间。
#include <iostream>#include <vector>
using namespace std;
int main()
vector<int> v;
v.push_back(3); //数组尾部插入3
v.push_back(2);
v.push_back(1);
v.push_back(0);
cout << " 下标 " << v[3] << endl;
cout << " 迭代器 " << endl;
for(vector<int>::iterator i = v.begin();i!= v.end();++i)
cout << *i << " ";
cout << endl;
//在第一个元素之前插入111 insert begin+n是在第n个元素之前插入
v.insert(v.begin(),111);
//在最后一个元素之后插入222 insert end + n 是在n个元素之后插入
v.insert(v.end(),222);
for(vector<int>::iterator i = v.begin();i!= v.end();++i)
cout << *i << " ";
cout << endl;
vector<int> arr(10);
for(int i = 0; i < 10; i++)
arr[i] = i;
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
cout << *i << " ";
cout << endl;
//删除 同insert
arr.erase(arr.begin());
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
cout << *i << " " ;
cout << endl ;
arr.erase(arr.begin(),arr.begin()+5);
for(vector<int>::iterator i = arr.begin();i!= arr.end();++i)
cout << *i << " " ;
cout << endl ;
return 0 ;
C++ 动态分配的 std::vector
【中文标题】C++ 动态分配的 std::vector【英文标题】:C++ Dynamically allocated std::vector 【发布时间】:2013-11-18 22:26:31 【问题描述】:我是 C++ 新手,我正在用 C++ 编写大学项目 Driver Book。 我是第一次使用向量,我想让它与动态内存分配一起使用。
我有这样声明的向量:
vector <item> book;
需要什么才能使其与动态内存分配一起使用?
提前致谢。
【问题讨论】:
请详细说明使其适用于动态内存分配!在哪些方面声明vector <item> book
不足以满足您的需求?
vector 内部使用动态分配,没有太多需要在任何标准库容器上真正使用动态分配。
vector 确实适用于动态分配,总是。你不需要做任何事情来做到这一点。我想你的问题是'如何使用矢量?'
【参考方案1】:
完成。当您 push_back
进入时,vector
已经在内部动态分配。
【讨论】:
【参考方案2】:更详细一点:vector<T>
是一个可调整大小的数组,它可以容纳T
类型的对象。
它在内部动态获取内存。现在,如果您想创建具有动态分配的向量,您可以随时使用vector<item>* myVec = new vector<item>();
虽然通常您永远不需要动态创建vector
。
【讨论】:
【参考方案3】:向量在内部使用动态内存分配。所以你需要做的就是把元素放进去:
item i = ....;
book.push_back(i);
请参阅this reference,了解您可以使用矢量执行的更多操作。
【讨论】:
以上是关于C++ 中 vector 如何实现内存分配的主要内容,如果未能解决你的问题,请参考以下文章
C++ multimap<int, vector<string>> 内存分配问题
为字符串向量预分配内存(C++ vector<string>)