一、特点
可变长数组,支持下标访问,在尾部之外的位置插入/删除元素较慢 |
---|
二、容器操作
1.初始化
vector<int>vec0{ 1,2,3,3,2,1 }; //列表初始化
vector<int>vec1(10, 1); //vec1是含有10个int类型元素的容器,且每个元素初始化为1
vector<int>vec2{ 10,1 }; //vec2含有两个int元素,10和1
vector<string>vec3(10, "hello");//vec3含有10个string类型的元素,每个元素都是字符串"hello"
vector<string>vec4{ 10,"hello" }; //vec4和vec3一样
2.swap操作及探讨
swap从外观看两个容器的元素交换了,我们将打印两个容器的首元素地址观察交换前后有无变化
vector<string>vec3(10, "hello");
vector<string>vec4{ 5,"world" };
cout << &vec3[0] << endl;//011FB758
cout << &vec4[0] << endl;//011FB8A0
swap(vec3, vec4);
//vec3.swap(vec4); 这样也可以哦
cout << &vec3[0] << endl;//011FB8A0
cout << &vec4[0] << endl;//011FB758
我们发现,swap之后,两个容器首元素地址也互换了,说明vector执行swap操作交换的是两个容器的数据结构,而不单单是值的交换! |
---|
3.增删元素和assign
push_back
vector<int>vec1{ 1,2,3,4,5 };
vec1.push_back(100); //vec1: 1,2,3,4,5,100
insert
指定位置插入元素
vector<int>vec1{ 1,2,3,4,5 };
//在指定位置的前面插入元素,返回插入元素的位置
vec1.insert(vec1.end() - 1, 99); //vec1:1,2,3,4,99,5
利用insert的返回值
//下面这个循环利用了insert的返回值,只要输入的temp是数字,就会一直在vec1头部插入新输入的temp值
auto iter = vec1.begin();
int temp;
while (cin >> temp)
{
iter = vec1.insert(iter, temp);
}
插入一个范围的元素
/*示例1*/
vector<int>vec1{ 1,2,3,4,5 };
int a[5]{ 99,88,77,66,55 };
auto head = begin(a);
auto tail = end(a);
vec1.insert(vec1.end(),head,tail);
//vec1 : 1,2,3,4,5,99,88,77,66,55
/*示例2*/
vector<int>vec2{ 5,4,3,2,1 };
vector<int>vec3{ 9,8,7,6 };
vec2.insert(vec2.begin(), vec3.begin(), vec3.end());
//vec2 : 9,8,7,6,5,4,3,2,1
/*示例3*/
vector<int>vec4{ 9,7,5,3 };
vec4.insert(vec4.begin(), vec4.begin(), vec4.end());
//vec4: 9 7 5 3 9 7 5 3
/*示例4*/
vector<int>vec4{ 9,7,5,3 };
vec4.insert(vec4.begin(), 10, 99);//在首部插入10个99
可见:①insert有多种重载的实②insert接受范围的元素插入时,该范围是[head,tail)的左闭右开区间③范围区间可以是对象本身的区间 |
---|
assign
vector<int>vec1{ 1,2,3,4,5 };
vector<int>vec2;
vec2.assign(vec1.begin(), vec1.end()-2);
//vec2 : 1 2 3
vec2.assign(vec2.begin(), vec2.end() - 1);
//vec2 : 1 2
一、特点
与vector相似的容器,但专门用于保存字符 |
---|
二、容器操作
我们将略过一些通用的顺序容器操作(和vector相似),说一些string容器比较特别的
1.初始化
string str1{ "Good moning!" };
const char* stra = "yes,hello";
string str2(stra,4);//yes,
string str3(str1, 3);//d moning! 原型string str3(str,pos)
string str4(str1, 5, 3);//mon 原型string str4(str,pos,len)
string str5(stra + 1, 4);//es,h
string str6 = str1.substr(5);//morning!
string str7 = str1.substr(5, 3);//mor
cout << str7 << endl; //mor
2.insert,append,replace,erase,assign
string str1{ "Good moning!" };
str1.insert(str1.size(), "yes");//Good moning!yes
str1.insert(0, "hello");//helloGood moning!yes
str1.append("Michael");//helloGood moning!yesMichael
str1.replace(str1.begin(), str1.end(), "new one");//new one
str1.erase(0, 4);//one
string str2;
str2.assign(str1.begin(), str1.end() - 1);//on
3.string的搜索
string str1{ "Good moning!" };
string str2{ "mon" };
//在str1中查找str2中任意字符出现的第一个位置
int a = str1.find_first_of(str2);//1 因为str2中的 o 在 str[1]位置
//在str1中查找str2第一次出现的位置,有则返回下标,无则返回-1
a = str1.find(str2);//5
4.str与数值的转换
//第一种方法
string str1 = "123";
int a = stoi(str1);//123
//第二种方法
string str1 = "123";
int a;
istringstream irecord(str1);//
irecord >> a;
cout << a+1 << endl; //124
一、特点
固定大小数组,支持下标访问,但不可增删元素 |
---|
二、容器操作
1.初始化
array<int, 10> arr1{1, 2, 3}; //arr1是含有10个int元素的固定长度数组,前三个元素为1,2,3,后七个为0
array<int, 10>arr2 = arr1; //array支持赋值(前提是两个数组长度和元素类型都一致)
int a[10] = { 99,88,77 };
int b[10];
//b = a; 错误! 但是C++内置数组不可赋值互相赋值哦
2.swap操作以及对swap的探讨
为了检验swap是怎么进行交换,我们在交换前后打印两个容器第一个元素的地址
array<int, 5>arr3{ 11,22,33,44,55 };
array<int, 5>arr4{ 0 };
//为了检验swap是怎么进行交换,我们在交换前后打印两个容器第一个元素的地址
cout << &arr3[0] << endl; //00B9F5F0
cout << &arr4[0] << endl; //00B9F5D4
swap(arr3, arr4); //这样可以交换arr3和arr4的元素
//arr3.swap(arr4); //这样也可以
cout << &arr3[0] << endl; //00B9F5F0
cout << &arr4[0] << endl; //00B9F5D4
我们可以看出,swap前后arr3和arr4的第一个元素的地址都并未发生变化,说明swap是将两个容器对应位置的元素的值进行交换。 于是,交换两个array数组所需时间与数组长度成正比 |
---|
3.元素访问:迭代器迭代访问和随机访问
//支持迭代器迭代访问
for (array<int, 5>::iterator iter = arr3.begin(); iter != arr3.end(); iter++)
{
cout << *iter << endl;
}
//也支持随机下标访问
cout << arr3[2] << endl;
//其他的成员函数
cout<<arr3.at(2)<<endl;
cout<<arr3.front();
cout<<arr3.back();
4.容器大小操作
vector<int>vec1{ 1,2,3,4,5 };
//查看元素的已有元素数量
cout << vec1.size() << endl;
//查看元素的容量
cout << vec1.capacity() << endl;
//预定容器的容量
vec1.reserve(1);
//将容器容量收缩到大小与元素数量一致
vec1.shrink_to_fit();
//resize(n,t)将容器的容量和元素数量都置为n,并用t补全作为新增的元素
vector<int>vec2{ 1,2,3,4,5 };
vec2.resize(10,9);
cout << vec2.size() << endl;//10
cout << vec2.capacity() << endl;//10
//vec2:1,2,3,4,5,9,9,9,9
一、特点
双端队列,支持随机访问,在头尾增删元素很快 |
---|
一、特点
双向链表,只支持双向顺序访问,在任何位置增删元素都很快 |
---|
一、特点
单向链表,只支持单向顺序访问,在任何位置增删元素都很快 |
---|
参考资料:《C++ Primer》中文版第五版