C++ Standard Library 之vector(向量)介绍

C++ Standard Library 之vector(向量)介绍,第1张

C++ Standard Library 之vector(向量)介绍 C++ Standard Library 之vector介绍 【简介】
C++标准库中的vector是表示数组的序列容器,大小可以改变。
vector是一种标准容器,它提供对任意顺序的单个元素的固定时间访问。
vector将元素赋值到内部的dynamic arry(动态数组)中,元素之间总是存在一定的顺序,所以vector是一个有序集合。支持随机访问,因此只要知道位置,你可以在常量时间内访问任何一个元素。vector提供随机访问迭代器,所以适用于任何STL算法。
如果你在末端附加或者删除元素,vector的效率相当好。但是你在前端或者中段插入或删除元素,效率就不怎么样了,因为作用点之后的每一个元素都必须移到另一位置,而每次移动都得调用assignment *** 作符。【头文件】
#include 【函数原型】
template >
// 参数1可以是任意类型_Tp,可有可无的第二个参数用来定义内存模型(memery model),默认的内存模型是C++标准库提供的allocator)
    class vector;【声明】
vector coll; // 创建了个类型为int的vector【vector的大小和容量】
如果超过当前vector能容纳的量,vector就要重新分配内存:
1、一旦重新分配内存,vector元素相关的所有reference、pointer、interator都会失效
2、内存重新分配很耗时间。
避免重新分配内存的解决方案:
1、使用reserve()保留适当容量,避免重新分配内存,如此一来,只要保留的容量差不多足够用,就不用担心reference失效:
    vector v; //创建个空vector
    v.reserve(80);  //预留80个元素的内存
2、初始化期间就向构造函数传递额外实参,构建足够的空间。如果你的实参是个数值,它将成为vector的起始大小。
    vector v(5); // 创建一个vector向量v,默认初始化5个元素。构造函数 *** 作效果vector cDEFAULT默认构造函数,产生一个空vector,没有任何元素。vector c(c2)COPY拷贝构造函数,建立c2的同型vector并成为c2的一份拷贝(所有元素都被复制)。vector c = c2COPY拷贝构造函数,建立一个新的vector作为c2的一份拷贝(所有元素都被复制)。vector c(rv)MOVE构造函数,建立一个新的vector,取rvalue rv的内容。C++11vector c = rvMOVE构造函数,建立一个新的vector,取rvalue rv的内容。C++11vector c(n)利用元素的default构造函数生成一个大小为n的vectorvector c(n,elem)创建一个大小为n的vector,每个元素值都是elem。例如vector a(5,888);vector c(begin,end)

创建一个vector,以区间[begin,end)作为元素初始值。例如可以使用上面定义过的vector a 的区间元素来创建个b:

vector b(a.begin(),a.end());

vector c(initlist)创建一个vector,以初始列initlist的元素为初始值。 C++11vector c = initlist创建一个vector,以初始列initlist的元素为初始值。 C++11析构函数c.~vector销毁所有元素,释放内存判断
非更易型 *** 作
(Nonmodifying Operation)c.empty()返回容易是否为空(相当于size()==0,但'也许‘比较快)c.size()返回目前元素的个数c.capacity()返回“不进行空间重新分配” 条件下的元素的最大容量。c.reserve(num)如果容量不足,扩大之。(注意:reserve()和shrink_to_fit()会变更vector,因为它们会造成所有指向元素的reference、pointer、iterator失效)c.shrink_to_fit()降低容量,以符合元素个数。C++11c1 == c2 *** 作符有 == 、!=、 <、  <=、 >、>=等,它的作用跟你想的一样,嗯。赋值c = c2将c2的全部元素赋值给cc = rv将rvalue rv的所有元素以move assign方式给予c。C++11c = initlist将初值列initlist的所有元素赋值给c。C++11c.assign(n,elem)赋值n个elem,赋值给cc.assign(begin,end)将区间[begin,end)区间的元素赋值给cc.assign(initlist)将初值列initlist的所有元素赋值给c。C++11c1.swap(c2)置换c1和c2的数据swap(c1,c2)置换c1和c2的数据访问元素【说明】如果要访问所有vector元素,你必须得使用range-base for循环、或特定的 *** 作函数、或使用迭代器c[idx]返回索引idx所指的元素c.at[idx]返回索引idx所指的元素,如果idx超出范围就抛出range-error异常c.front()返回第一个元素(不检查是否存在第一个元素)c.back()返回最末元素(不检查是否存在最末尾的元素)vector迭代器c.begin()返回一个random-access iterator(随机访问迭代器) 指向第一个元素(返回值本质是个指针)c.end()返回一个random-access iterator指向最末元素的下一位置c.cbegin()返回一个const random-access iterator指向第一个元素。C++11c.cend()返回一个const random-access iterator指向最末元素的下一位置。C++11c.rbegin()返回一个反向的(reverse) iterator指向反向迭代器的第一元素c.rend()返回一个反向的(reverse) iterator指向反向迭代器的最末元素的下一位置c.crbegin()返回一个const reverse iterator指向反向迭代器的第一元素。C++11c.crend()返回一个const reverse iterator指向反向迭代器的最末元素的下一位置。 C++11安插和移除元素c.push_back()附加一个elem的拷贝于末尾c.pop_back()移除最后一个元素,但不返回c.insert(pos,elem)在iterator位置pos前方插入一个elem拷贝,并返回新元素的位置。pos指的是迭代器所指向的位置(position),例如:a.insert(a.begin(),9); 在a的首位插入9c.insert(pos,n,elem)在iterator位置pos前方插入n个elem拷贝,并返回第一个新元素的位置,(如果没有新元素返回pos)c.insert(pos,begin,end)在iterator位置pos之前方插入区间[begin,end)内所有元素的一份拷贝,并返回第一个新元素的位置,(如果没有新元素返回pos)。c.insert(pos,initlist)在iterator位置pos之前插入初始列initlist内所有元素的一份拷贝,并返回第一个新元素的位置,(如果没有新元素返回pos)。C++11c.emplace(pos,args...)在iterator位置pos前插入一个以args为初始值的元素,并返回新元素的位置。C++11c.emplace_back(args...)追加一个args为初始值的元素于末尾,不返回任何东东。C++11c.erase(pos)移除iterator位置pos上的元素,返回下一元素的位置。c.erase(begin,end)移除[begin,end)区间内的所有元素,返回下一元素的位置。(其实这个begin和end指的都是元素的下标)c.resize(num)将元素数量改为num(如果size()变大,多出来的新元素都需要以default构造函数完成初始化。)c.resize(num,elem)将元素数量改为num(如果size()变大,多出来的新元素都是elem的拷贝)c.clear()移除所有元素,将容器清空异常处理vector只支持最低限度的逻辑错误检查,下标 *** 作符的安全版本at()是唯一可以抛出异常的函数。
析构函数不得抛出异常。特化版本:class vectorc.flip()将所有bool元素值相反(negate),也就是对所有Bit求补数。c[idx].flip()将索引idx所指的bit元素相反,也就是对单一bit求补数。c[idx] = val将索引idx所指的Bit元素赋值为valc[idx_1] = c[idx_2]将索引idx_1所指的bit元素赋值为索引idx_2所指的bit元素值

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4948556.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存