码迷,mamicode.com
首页 > 其他好文 > 详细

STL标准库-容器-vector

时间:2017-08-25 01:23:28      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:equal   include   算法   blog   iter   merge   过程   sort   sea   

摘要: 技术在于交流、沟通,本文为博主原创文章转载请注明出处并保持作品的完整性。

我对向量容器vector的理解就是一个动态数组,内存连续,它是动态分配内存,且每次扩张的原来的二倍.

他的结构如下

技术分享


 

一 定义 

vector< 类型 > 标识符(最大容量,初始所有值)

vector是一种类模板,那么他有很多行为与类相似

头文件 #include <vector>

    //a.定义 vector<typeName> v;
    vector<int> v;
    
    //b.拷贝构造 vector<typeName> v1(v); 例:vector<int> v1(v); 
    vector<int> v1;
    
    //c.赋值拷贝
    v1 = v; //如果v的size比v1的size大,则自动扩充v1的空间,反之亦然
    
    //d.按指定元素个数定义
    vector<int> v2(5); //v2含有5个值为0的元素
    
    //e.指定元素个数及类型
    vector<int> v3(5,10);//v3包含5个值为10的int类型元素
    
    //f.与array间的转换
    int a[3]={0,1,2}; vector<int> v4(a,a+3);    

 


 

二 基本使用

   vector<int> v;
    //在vector尾端插入元素
    //但是没有在前面插入元素,上面的vector结构图中,我们可以看出来vector是一种向后扩充的容器,
    //如果在前面插入,那后面所有的元素将后移,造成巨大的消耗,所以没有push_front()
    //同理没有pop_front()
    v.push_back(1);
    
    //删除最后一个元素
    v.pop_back();
    
    //返回元素个数
    int count = v.size();
    
    //重新设定vector的size
    v.resize(2*(v.size()));
    
    //判断容器是否为空
    bool isEmpty = v.empty();
    
    //[index]操作,返回下表为index的元素
    int tmp = v[1];
    
    //定义迭代器
    vector<int> ::iterator iter = v.begin();
    
    for(int i = 0; i<3; i++ )
    {
        v.push_back(1); // 1 1 1
    }
    //在 v的前面插入两个 5
    v.insert(iter, 2, 5); // 5 5 1 1 1
    
    //在头部插入3
    v.insert(v.begin(), 3);//3 5 5 1 1 1
    
    //在尾部插入3
    v.insert(v.end(), 3);//3 5 5 1 1 1 3
    
    //下表5的前面插入3
    v.insert(v.begin()+5, 3);//3 5 5 1 1 3  1 3
    
    //删除指定下标元素
    v.erase(v.begin()+1); //3 5 1 1 3 1 3
    
    //清空
    v.clear();
    
    //起始地址
    v.data();
    
    //最后一个元素后面的地址
    v.end();
    
    //实际内存大小
    v.capacity();
    
    //at(下标)
    v.at(1);
    
    //返回最后一个元素
    v.back();
    
    //返回第一个元素
    v.front();
    
    //将指定区间内的元素赋值给v
    v.assign(v.begin()+1, v.begin()+2);
    
    //赋值 将三个 1 赋值给v 那么vecotr将变为 1 1 1
    v.assign(3, 1);

  //最大内存
   v.max_size();

    //输出
    for(auto iii : v)
    {
        cout << iii <<endl;
    }

 

 


 

三 vector支持的算法

增加头文件#include<algorithm> //算法

#include <algorithm>
int main()
{
    //可以使用的全局算法有
    //搜索算法:find() 、search() 、count() 、find_if() 、search_if() 、count_if()
    //分类排序:sort() 、merge()
    //删除算法:unique() 、remove()
    //生成和变异:generate() 、fill() 、transformation() 、copy()
    //关系算法:equal() 、min() 、max()
    vector<int> c;
    
    for(int i = 0; i<10; i++ )
    {
        c.push_back(i); //
    }

    //查找函数 find(begin,end, searchItem)
    auto pItem = ::find(c.begin(), c.end(), 3);
    
    if(pItem != c.end())
        cout << "找到了: " << *pItem << endl;
    else
        cout << "没找到" << endl;
    
    
    vector<int> c1;
    
    for(int i = 0; i<10; i++ )
    {
        c1.push_back(i+10); //
    }
    
    //查找函数search 是否包含子序列容器向量 如果包含 返回包含位置
    auto pItem1 = ::search(c.begin(), c.end(), c1.begin()+2, c1.begin()+5);
    
    if(pItem1 != c.end())
        cout << "找到了: " << *pItem1 << endl;
    else
        cout << "没找到" << endl;
    
    //算法就不一一举例了
    return 0;
}

 输出结果

技术分享


 

四 内存管理

上面提到过vector的扩充是以2倍的形式扩充,它的扩充过程可以理解成  if (v.size()元素个数 > v.capacity()实际内存) v.resize(2*v.capacity())

当vector发现元素个数大于实际内存时, vector将重新申请一块内存为原来的内存2倍的空间 然后将原来的元素一一copy过去,我们都知识申请内存是非常耗时的,所以我们一定要把握好vector的内存尺度

下面来测试一下

    void vector_test_capactity()
    {
        //创建vector
        std::vector<int> v;
        for(int i = 0; i<10 ; i++)
        {
            cout<<"容器内元素个数: " << v.size() << " "<<"vector内存大小: " << v.capacity()<<endl;
            v.push_back(i);
        }
    }

输出结果

技术分享

 

STL标准库-容器-vector

标签:equal   include   算法   blog   iter   merge   过程   sort   sea   

原文地址:http://www.cnblogs.com/LearningTheLoad/p/7425944.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!