一. vector
1. 赋值操作
1.1 函数原型
vector& operator=(const vector& vec);//重载等号操作符
assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身
assign(n,elem);//将n个elem拷贝赋值给本身
1.2 demo
#include <iostream>
#include <vector>
using namespace std;
void out_vector(vector<int> &vec)//构造函数打印数组,方便验证
{
for(vector<int>::iterator it=vec.begin();it<vec.end();it++)
cout<<*it<<" ";
cout<<endl;
}
int main()
{
vector<int> v1;
for(int i=0;i<5;i++)//创建道具v1并给其插入元素,为之后验证服务
v1.push_back(i+1);
out_vector(v1);//打印验证,第1行应输出1 2 3 4 5
vector<int> v2;
v2=v1;//赋值方法1:重载等号运算符
out_vector(v2);//打印验证,第2行应输出1 2 3 4 5
vector<int> v3;
v3.assign(v2.begin()+1,v2.end()-1);//赋值方法2:区间数据拷贝赋值
out_vector(v3);//打印验证,第3行应输出2 3 4
vector<int> v4;
v4.assign(4,3);//赋值方法3:若干个数据拷贝赋值
out_vector(v4);//打印验证,第4行应输出3 3 3 3
return 0;
}
2. resize
2.1 函数原型
void resize (size_type n);//
void resize (size_type n, const value_type& val);
调整容器的大小,使其包含n个元素。
2.2 说明
- 如果n小于当前容器的大小,则将内容减少到其前n个元素,并删除超出范围的元素(并销毁它们)。
- 如果n大于当前容器的大小,则通过在末尾插入所需数量的元素来扩展内容,以达到n的大小。如果指定了val,则将新元素初始化为val的副本,否则将对它们进行值初始化。
- 如果n也大于当前容器容量,将自动重新分配已分配的存储空间。
请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容。
2.3 demo
// resizing vector
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some initial content:
for (int i=1;i<=10;i++) myvector.push_back(i);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i]; // 1 2 3 4 5 6 7 8 9 10
std::cout << '\n';
myvector.resize(5);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i]; // 1 2 3 4 5
std::cout << '\n';
myvector.resize(8,100);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i]; //1 2 3 4 5 100 100 100
std::cout << '\n';
myvector.resize(12);
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i]; //1 2 3 4 5 100 100 100 0 0 0 0
std::cout << '\n';
return 0;
}
3. reserve&resize的区别,size和capacity的区别
参考博客:https://blog.csdn.net/u013575812/article/details/51171135
vector中这两个属性很容易弄混淆。
size是当前vector容器真实占用的大小,也就是容器当前拥有多少个元素。
capacity是指在发生realloc前能允许的最大元素数,即预分配的内存空间。
当然,这两个属性分别对应两个方法:resize()和reserve()。
使用resize(),容器内的对象内存空间是真正存在的。
使用reserve()仅仅只是修改了capacity的值,容器内的对象并没有真实的内存空间(空间是"野"的)。
此时请勿使用[]操作符访问容器内的对象,很可能出现数组越界的问题。
#include <iostream>
#include <vector>
using std::vector;
int main(void)
{
vector<int> v;
std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
v.reserve(10);
std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
v.resize(10);
v.push_back(0);
std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;
return 0;
}
注:对于reserve(10)后 接着直接使用[]访问越界报错(内存是野的),大家可以加一行代码试一下,我这里没有贴出来。
这里直接用[]访问,vector退化为数组,不会进行越界的判断。此时推荐使用at(),会先进行越界检查。
4. at
https://www.cnblogs.com/xiangtingshen/p/12326709.html
[]和at()的区别在于[]不检查索引是否有效,而at()在遇到无效索引时会抛出out_of_range异常.
c++标准不要求vector::operator[]进行下标越界检查,原因是为了效率,总是强制下标越界检查会增加程序的性能开销
5. 插入元素
insert // 通过在指定位置的元素之前插入新元素来扩展该容器,通过插入元素的数量有效地增加容器大小
push_back //在容器的最后一个元素之后添加一个新元素
emplace_back //在 vector 的末尾插入一个新的元素,紧跟在当前的最后一个元素之后
emplace //通过在 position(参数)位置处插入新元素 args(参数)来扩展容器
insert
https://docs.naivesystems.com/kb/vector-insert-in-c-plus-plus
https://www.cnblogs.com/shona/p/10789721.html
insert() O(N) //插入元素,O(n)的复杂度
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v(3);
v[0]=2; //v[0]是第0个元素
v[1]=7;
v[2]=9;
v.insert(v.begin(),8);//在最前面插入新元素。
v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素
v.insert(v.end(),3);//在向量末尾追加新元素。
v.insert(v.end(),4,1);//在尾部插入4个1
int a[] = {1,2,3,4};
v.insert(v.end(),a[1],a[3]);//在尾部插入a[1]个a[3]
vector<int>::iterator it;
for(it=v.begin(); it!=v.end();it++)
{
cout<<*it<<" "; 8 2 1 7 9 3 1 1 1 1 4 4
}
cout<<endl;
return 0;
}
push_back和emplace_back的区别
https://www.cnblogs.com/nntzhc/p/14073569.html
1、push_back() 在底层实现时,会优先选择调用移动构造函数,如果没有才会调用拷贝构造函数。
2、push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。
3、emplace_back不能完全代替push_back。