STL标准库-容器-vector

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

我对向量容器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);
        }
    }

输出结果

时间: 2024-08-02 02:49:48

STL标准库-容器-vector的相关文章

STL标准库-容器-set与multiset

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key set的key不能相同.multiset的key相同.关联容器的查找效率要高于顺序容器很多很多. set和multiset不提供用来直接存取元素的任何操作函数,取值需要通过迭代器 一 定义 1.set/mulitiset以红黑树为底层结构,因此有元素自动排序的特性,排序是根据key,而set.m

STL标准库-容器-list

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历.在list 的任意位置插入和删除元素的效率都很高. 它的结构 一 定义 头文件 #include <vector> #include <iostream> #include <list> using namespace std; int main(int argc, const c

STL标准库-容器-rb_tree

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 红黑树,关联式容器底层实现(map set),在使用中基本运用不到,但是还是想了解一下他的运作方式 Red_Black tree是平衡二分搜寻树(balanced binary search tree),它是高度平衡的二叉树,这样有利于search和insert. 红黑树提供遍历,如果如果按正常规则(++iter)遍历,便能获得排序状态 如上图,你会发现返回迭代器头的begin()函数指向的是"5"

STL标准库-容器适配器

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 上一节介绍了仿函数适配器,这节主要介绍容器适配器和迭代器适配器的概念,其实容器适配器和迭代器其适配器就是封装了一些其他class的方法,非常好理解. 如果你想让一个calss拥有另一个class的功能,你都可以这样做:1.继承 2.包含 迭代器适配器 运用继承方式,实现适配功能,其实现与仿函数适配器相似. 容器适配器中主要运用的就是包含,即一个类含的一个成员变量是另一个类,本节简单介绍两个容器适配器 容器适配器 qu

STL标准库-容器-deque

摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存连续的假象. 其实deque由一段一段构成 ,他是分段连续,而不是内存连续 当走向段的尾端时候自动跳到下一段 所以支持迭代器++ 操作,自动跳到下一段的方法由operator++实现 deque每次扩充 申请一个段 一 定义 头文件 #include <deque> int main_0(

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

STL标准库-算法-常用算法

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each() for一段区间 做你指定的行为 3.replace(), replace_if(), replace_copy() 替换函数 4.count(), count_if() 计数 5.find() 查找 6.sort() 排序 7.binary_search()查看元素是否在

标准库类型vector

标准库类型vector表示对象的集合,其中所有对象的类型都相同.集合中的每个对象都有一个与之对应的索引,索引用于访问对象.因为vector“容纳着”其他对象,所以它被称为容器. 要想使用vector,必须包含适当的头文件.#include<vector> C++语言既有类模板,也有函数模板 ,其中vector是一个类模板. 模板本身不是类或函数,相反可以将模板看作为编译器生成类或者函数编写的一份说明.编译器根据模板创建类或函数的过程成为实例化,当使用模板时,需要指出编译器应把类或函数实例化为何

参考C++STL标准库中对了的使用方法

http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 当然是使用c++中的STL 的queue啦.下面简要介绍一下使用方法. 1 准备工作 头文件 #include<queue> 2 声明和定义的方法.STL的队列是泛型模板,支持任何内置和构造类型. 比如对于刚才那个牛奶问题.我把状态