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要高一点。主要还是要看应用场景吧。 参考技术A

vector有内存管理的机制,也就是说对于插入和删除,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 &lt;item&gt; book 不足以满足您的需求? vector 内部使用动态分配,没有太多需要在任何标准库容器上真正使用动态分配。 vector 确实适用于动态分配,总是。你不需要做任何事情来做到这一点。我想你的问题是'如何使用矢量?' 【参考方案1】:

完成。当您 push_back 进入时,vector 已经在内部动态分配。

【讨论】:

【参考方案2】:

更详细一点:vector&lt;T&gt; 是一个可调整大小的数组,它可以容纳T 类型的对象。 它在内部动态获取内存。现在,如果您想创建具有动态分配的向量,您可以随时使用vector&lt;item&gt;* myVec = new vector&lt;item&gt;(); 虽然通常您永远不需要动态创建vector

【讨论】:

【参考方案3】:

向量在内部使用动态内存分配。所以你需要做的就是把元素放进去:

item i = ....;
book.push_back(i);

请参阅this reference,了解您可以使用矢量执行的更多操作。

【讨论】:

以上是关于C++ 中 vector 如何实现内存分配的主要内容,如果未能解决你的问题,请参考以下文章

c++ 内存分配向量的指针

C++ multimap<int, vector<string>> 内存分配问题

为字符串向量预分配内存(C++ vector<string>)

c++ 在 for 循环中的 vector<char> 中的 for 循环中的内存分配

C++ Vector 实现分配新对象

C++ 动态分配的 std::vector