C+部分标准库容器:vector,string,array

文章目录

    • vector
    • string
    • array
    • deque
    • list
    • forward_list

vector

一、特点

可变长数组,支持下标访问,在尾部之外的位置插入/删除元素较慢

二、容器操作
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

string

一、特点

与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

array

一、特点

固定大小数组,支持下标访问,但不可增删元素

二、容器操作
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

deque

一、特点

双端队列,支持随机访问,在头尾增删元素很快

list

一、特点

双向链表,只支持双向顺序访问,在任何位置增删元素都很快

forward_list

一、特点

单向链表,只支持单向顺序访问,在任何位置增删元素都很快

参考资料:《C++ Primer》中文版第五版

你可能感兴趣的:(c++基础)