精华内容
下载资源
问答
  • vector是动态空间,随着新元素的插入,旧存储空间不够用时,vector内部机制会自行扩充空间以容纳新元素,当然,这种空间扩充大部分情况下(几乎是)也逃脱不了“三部曲”,只是不需要用户自己处理,而且vector处理得...
    • 什么是容器

      容器,顾名思义,是用来容放东西的场所。C++容器容放某种数据结构,以利于对数据的搜寻或排序或其他特殊目的。众所周知,常用的数据结构不外乎:数组array, 链表list, 树tree, 栈stack, 队列queue, 散列表hash table, 集合set、映射表map 等等。容器便是容纳这些数据结构的。这些数据结构分为序列式与关联式两种,故容器也分为序列式容器和关联式容器。

    0ba2bc6128f10424e9e6a7e197e1a3a5.png

                       (图来自《STL源码剖析》)

    • vector容器

    1. vector是STL提供的一种序列式容器

      所谓序列式容器,其中的元素都序,但未必有序,即元素集合呈线性关系排列,但未必是有序的。C++本身带了一种序列式容器array,STL再提供其他的序列式容器:vector,list,deque,stack,queue,priority-queue等。

    2. vector底层为动态数组

    vector的数据安排以及操作方式与C++的array十分相似,它们间的唯一差别在于对空间的运用灵活性上。array为静态数组,有着静态数组最大的缺点:每次只能分配一定大小的存储空间,当有新元素插入时,要经历 “找到更大的内存空间”->“把数据复制到新空间” ->“销毁旧空间” 三部曲, 且对于array而言,这种空间任务压在使用它的用户身上,用户必须把握好数据的数量,尽量在第一次分配时就给数据分配合理的空间(这有时很难做到),以防止“三部曲”带来的代价,而数据溢出也是静态数组使用者需要注意的问题。

      而vector用户不需要亲自处理空间运用问题。vector是动态空间,随着新元素的插入,旧存储空间不够用时,vector内部机制会自行扩充空间以容纳新元素,当然,这种空间扩充大部分情况下(几乎是)也逃脱不了“三部曲”,只是不需要用户自己处理,而且vector处理得更加安全高效。vector的实现技术关键就在于对其大小的控制以及重新配置时数据移动效率。

    3. vector的迭代器

    对于C语言的数组,我们使用普通指针就可以对数组进行各种操作。vector维护的是一个连续线性空间,与数组array一样,所以无论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要的条件。vector所需要的迭代器操作,包括operator*,operator->,operator++,operator--,operator+=,operator-=等,普通指针都具有。

      故,普通指针即可满足vector对迭代器的需求。所以,vector提供了Random Access Iterators。

    4. vector的数据结构

      正如上面所说,vector底层为连续线性空间。它使用两个迭代器:begin与finish该连续线性空间中的第一个元素的位置与超出末端的第一位位置,这两个迭代器标志了连续线性空间的已使用范围,并以end_of_storage迭代器标准整个连续线性空间的尾端。这里begin与finish符合STL“前开后闭”的标准。

    2fba540d0e3d2b4a03000b399f317eda.png

      基于这三个迭代器,可以完成许多操作。包括提供首尾标示、大小、容量、空容器判断、[]运算符、最前端元素值、最后端元素值等等。

      值得注意的是,容器的大小与容量是不一样的概念。只有在容器满载时,大小才等于容器。在上面这张图中,大小size为已使用的存储空间长度,而容量为已使用+未使用的存储空间长度。从它们的实现代码上也可以看出来:

    size_type size() const
    {
          return size_type( end() - begin() ) ;
    }
    
    size_type capacity () const
    {
         return size_type( end_of_storage - begin() );
    }

    5. vector的内存分配策略

    标准库的实现者使用了这样的内存分配策略:以最小的代价连续存储元素。为了使vector容器实现快速的内存分配,其实际分配的容量要比当前所需的空间多一些,vector容器预留了这些额外的存储区用于存放添加的新元素,于是不必为每个新元素进行一次内存分配。当继续向容器中加入元素导致备用空间被用光(超过了容量 capacity),此时再加入元素时vector的内存管理机制便会扩充容量至两倍,如果两倍容量仍不足,就扩张至足够大的容量。容量扩张必须经历“重新配置、元素移动、释放原空间”这个浩大的工程。按照《STL源码剖析》中提供的vector源码,vector的内存配置原则为:

     如果vector原大小为0,则配置1,也即一个元素的大小。

      如果原大小不为0,则配置原大小的两倍。

      当然,vector的每种实现都可以自由地选择自己的内存分配策略,分配多少内存取决于其实现方式,不同的库采用不同的分配策略。

      需要注意的是,使用vector迭代器时要时刻注意vector是否发生了扩容,一旦扩容引起了空间重新配置,指向原vector的所有迭代器都将失效。 


    C++学习之路

    fac3201ce87fe33b7acb41edb2c2bd8f.png

    展开全文
  • int countOdds(int low, int high) { ... std::vector<int>temp{high-low+1,0}; int n = low; std::generate(temp.begin(),temp.end(),[&]{return n++;}); for (auto x:temp) { std::cout <...
        int countOdds(int low, int high) {
            int count = 0;
            std::vector<int>temp{high-low+1,0};
            int n = low;
            std::generate(temp.begin(),temp.end(),[&]{return n++;});
            for (auto x:temp) {
                std::cout << x;
            }
        }

    使用Itoa

        int countOdds(int low, int high) {
            int count = 0;
            std::vector<int>temp(high-low+1);
            std::iota(temp.begin(),temp.end(),low);
            for (auto x:temp) {
                std::cout << x;
            }
            return 0;
        }

     

    展开全文
  • vector&lt;vector&lt;int&gt; &gt; v(n, vector&lt;int&gt;(m, num)); //n行m列,初始化数值num vector&lt;vector&lt;int&gt; &gt; v(0, vector&lt;int&gt; (0));...

    1、定义时初始化

    vector<vector<int> > v(n, vector<int>(m, num));   //n行m列,初始化数值num
    
    vector<vector<int> > v(0, vector<int> (0));       //不确定行列数
    
    vector<vector<int> > v;          //不确定行列数

    2、使用 resize() 函数

    vector<vector<int>> v;
    v.resize(n);
    for(int i=0;i<n;i++)
        v[i].resize(m);

     

    展开全文
  • 1.vector<int> list1; 默认初始化,最常用 此时,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。 这种初始化方式适用于元素个数未知,需要在程序中动态添加...

    1.vector<int> list1; 默认初始化,最常用

    此时,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。 这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。

     2.vector<int> list2(list); 或者 vector<int> ilist2 = ilist; //拷贝初始化 ,"="

    两种方式等价 , list2 初始化为list 的拷贝, list必须与list2 类型相同, 也就是同为int的vector类型, ilist2将具有和ilist相同的容量和元素

     3.vector<int> list = {1,2,3.0,4,5,6,7};

    vector<int> list {1,2,3.0,4,5,6,7};//列表中元素的拷贝 ilist 初始化为列表中元素的拷贝,列表中元素必须与ilist的元素类型相容, 本例中必须是与整数类型相容的类型,整形会直接拷贝,其他类型会进行类型转换。

     4.vector<int> list3(list.begin()+2, list.end()-1); //比较常用

     将points数组转换成vector; 挺好用的; list3初始化为两个迭代器指定范围中元素的拷贝,范围中的元素类型必须与list3 的元素类型相容, 在本例中ilist3被初始化为{3,4,5,6}。

    注意:由于只要求范围中的元素类型与待初始化的容器的元素类型相容,因此迭代器来自不同的容器是可能的,例如,用一个double的list的范围来初始化ilist3是可行的。另外由于构造函数只是读取范围中的元素进行拷贝,因此使用普通迭代器还是const迭代器来指出范围并没有区别。 这种初始化方法特别适合于获取一个序列的子序列。

     5.vector<int> ilist4(7); ilist4中将包含7个元素

    默认值初始化,ilist4中将包含7个元素,每个元素进行缺省的值初始化, 对于int,也就是被赋值为0,因此ilist4被初始化为包含7个0。 当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候, 可采用这种初始化方式。  

    6.vector<int> ilist5(7,3);

    指定值初始化,ilist5被初始化为包含7个值为3的int; 这个也比较常用。

    展开全文
  • 'C++ vector的初始化'

    万次阅读 2019-04-12 23:30:38
    因为编算法的时候经常用的STL函数库的vector,每次初始化的时候都要搜一下,这次自己整理一下。 一维数组的初始化1. vector < int > v;这时候v的size为0,如果直接进行访问 v[i] 会报错。这里可以使用 v....
  • vector的初始化及常用操作

    千次阅读 2018-08-02 11:20:42
    1.vector的初始化:可以有五种方式,举例说明如下: (1) vector&lt;int&gt; a(10); //定义了10个整型元素的... //定义了10个整型元素的向量,且给出每个元素的初值为1(3)vector&lt;int&gt;a(b); ...
  • 二维vector初始化

    千次阅读 2016-07-26 15:37:12
    一个m*n的矩阵,元素全部初始化为0:vector<vector<int>> buff(m, vector(n,0));
  • C++ vector多维数组初始化及清零

    万次阅读 2016-05-13 17:20:06
    源地址:... vector常用方法 assign() 对Vector中的元素赋值 void assign( input_iterator start, input_iterator end ); // void assign( size_type num,
  • C和C++中用变量定义数组并赋初值   下面写的仅仅是个人的一点总结,因为水平有限,如果有什么错误欢迎大家批评指正,不胜感激。 在C和C++中,如果使用变量声明数组大小,尽量不要同时进行初始化,通常会编译错误...
  • c++ vector初始化

    千次阅读 2018-06-21 16:53:40
    转载... v(9)大小和初值:std::vector&lt;int&gt; v(9, 0),大小为9,初值均为0。大小和不同的初值:int x[] = {1, 2, 3}; std::vector&lt;int&gt; v(...
  • vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个... //定义了10个整型元素的向量,且给出每个元素的初值为1(3)vector<int> a(b); //用b向量来创建a向量,整体复
  • vector的几种初始化及赋值方式

    千次阅读 2018-06-27 11:22:56
    fps=1vector的几种初始化及赋值方式:(1)不带参数的构造函数初始化//初始化一个size为0的vector vector&lt;int&gt; abc;12(2)带参数的构造函数初始化//初始化size,但每个元素值为默认值 vector...
  • vector 有个函数assign, 可以帮助执行赋值操作。 assign会清空你的容器。   assign函数: 函数原型: void assign(const_iterator first,const_iterator last); void assign(size_type n,const T&amp; x = ...
  • vector> #include <iostream> int main() { using namespace std; vector<int> v1, v2, v3; //定义三个vector对象 v1.push_back(10); v1.push_back(20); v1.push_back(30); v1.push...
  • vector 数组初始化赋值 说明 总结c++ vector 一维数组,二维度数组的初始化赋值。 例子 #include<iostream> #include<vector> using namespace std; int main() { // 一维度,直接赋值 vector<...
  • C++_vector操作

    万次阅读 多人点赞 2019-05-28 11:24:15
    vector说明: vector是向量类型,可以容纳许多类型的数据,因此也...//定义具有10个整型元素的向量(尖括号为元素类型名,它可以是任何合法的数据类型),不具有初值,其值不确定 方式2. vector<int>a...
  • 定义和初始化vector对象
  • vector的几种初始化及赋值方法

    万次阅读 2018-10-08 10:58:30
    //初始化一个size为0的vector vector<int> abc; (2)带参数的构造函数初始化 //初始化size,但每个元素值为默认值 vector<int> abc(10); //初始化了10个默认值为0的元素 //初始化size,并且设置初始...
  • c++ 之vector用法

    千次阅读 2018-09-03 23:57:34
    本文以int类型为例,其他类型大同小异 - 一、定义及初始化 vector&amp;amp;lt;int&amp;amp;gt; vec; //声明一个int型向量 vector&amp;amp;lt;int&amp;...vector&
  • //初始化一个size为0的vector vector<int> a; (2)带参数的构造函数初始化 //初始化size,但每个元素值为默认值 vector<int> a(10); //初始化了10个默认值为0的元素 //初始化size,并且设置初始值 ...
  • vector

    2019-06-03 22:52:43
    vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件: #include<vector>; 一、vector 的初始化:可以有五种方式,举例...
  • 基础应用 vector a; //声明一个int型向量a vector a(10); //声明一个初始大小为10的向量 vector a(10, 1); //声明一个初始大小为10且初始值... //将数组n的前5个元素作为向量a的初值 vector a(&n[1], &n[4]); //将n[1
  • vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素...
  • 因为我习惯了变量初始化用memset,vector的变量也意外的用了memset。结果尼玛的调试了好长时间,才知道memset初始化vector变量会导致向量丢失,不能正常的遍历,但是可以正常的push_back。 编译器报错是:“vector ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,507
精华内容 7,802
关键字:

vector初值