第五部分—STL_3. 常用容器

本文详细介绍了C++ STL中的几种常用容器,包括string、vector、deque、stack、queue、list、set和multiset。内容涵盖容器的基本概念、数据结构、常用操作和API,以及它们各自的特点和适用场景。例如,string容器管理了C风格字符串的复杂性,提供了便捷的成员方法;vector和deque作为动态数组,支持高效的随机访问,但deque在头端操作上有优势;stack和queue遵循先进后出(FILO/FIFO)原则,适用于特定数据结构需求;list容器则是一个双向链表,适合频繁的插入和删除操作;set和multiset是基于红黑树的键值集合,自动排序并禁止(或多允许)键值重复。
摘要由CSDN通过智能技术生成

3.1 string容器

3.1.1 string容器基本概念

C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>

String和c风格字符串对比:

1.Char*是一个指针,String是一个类

string封装了char*,管理这个字符串,是一个char*型的容器。

2.String封装了很多实用的成员方法

查找find,拷贝copy,删除delete 替换replace,插入insert

3.不用考虑内存释放和越界

 string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

3.1.2 string容器常用操作

3.1.2.1 string 构造函数

string();                                  //创建一个空的字符串 例如: string str;      

string(const string& str);     //使用一个string对象初始化另一个string对象

string(const char* s);           //使用字符串s初始化

string(int n, char c);              //使用n个字符c初始化

void test()
{
	string str01;
	string str02(str01);
	string str03 = "abc";
	string str04(10, 'a');
	cout << str01 << endl;
	cout << str02 << endl;
	cout << str03 << endl;
	cout << str04 << endl;
}

int main()
{
	test();
	return 0;
}

输出结果



abc
aaaaaaaaaa

3.1.2.2 string基本赋值操作

string& operator=(const char* s);            //char*类型字符串 赋值给当前的字符串

string& operator=(const string &s);         //把字符串s赋给当前的字符串

string& operator=(char c);                        //字符赋值给当前的字符串

string& assign(const char *s);                  //把字符串s赋给当前的字符串

string& assign(const char *s, int n);        //把字符串s的前n个字符赋给当前的字符串

string& assign(const string &s);              //把字符串s赋给当前字符串

string& assign(int n, char c);                                //用n个字符c赋给当前字符串

string& assign(const string &s, int start, int n); //将s从start开始n个字符赋值给字符串

void test()
{
	string str01;
	str01.assign("abcde", 3);
	cout << str01 << endl;

	string str02;
	str02.assign(str01);
	cout << str02 << endl;

	string str03;
	//将s从0开始2个字符赋值给字符串
	str03.assign(str01, 0, 2);
	cout << str03 << endl;
}

int main()
{
	test();
	return 0;
}

输出结果

abc
abc
ab

3.1.2.3 string存取字符操作

char& operator[](int n);         //通过[]方式取字符

char& at(int n);                       //通过at方法获取字符

void test()
{
	string str = "hello world";
	for (int i = 0; i < str.size(); i++)
	{
		cout << str[i] << " ";
	}

	cout << endl;

	for (int i = 0; i < str.size(); i++)
	{
		cout << str.at(i) << " ";
	}

	cout << endl;

	//[]和at区别,[]访问越界 直接挂掉, at访问越界  抛出out_of_range异常
	try
	{
		cout << str.at(100) << endl;
	}
	catch (out_of_range& e)
	{
		cout << e.what() << endl;
	}
	catch (...)
	{
		cout << "异常捕获" << endl;
	}
}

int main()
{
	test();
	return 0;
}

输出结果

h e l l o   w o r l d
h e l l o   w o r l d
invalid string position

3.1.2.4 string拼接操作

string& operator+=(const string& str);               //重载+=操作符

string& operator+=(const char* str);                  //重载+=操作符

string& operator+=(const char c);                       //重载+=操作符

string& append(const char *s);                           //把字符串s连接到当前字符串结尾

string& append(const char *s, int n);    //把字符串s的前n个字符连接到当前字符串结尾

string& append(const string &s);          //同operator+=()

string& append(const string &s, int pos, int n); //把字符串s中从pos开始的n个字符连接到当前字符串结尾

string& append(int n, char c);                               //在当前字符串结尾添加n个字符c

void test()
{
	//拼接
	string str01 = "我";
	string str02 = "爱北京";
	string str03 = str01 + str02;
	cout << str03 << endl;

	//查找
	string str04 = "abcdef";
	int pos = str04.find("abc");
	if (pos == -1)
	{
		cout << "未找到字符串" << endl;
	}
	else
	{
		cout << "找到了字符串,起始位置为:" << pos << endl;
	}

	//替换
	string str05 = "hello world";
	//替换从pos开始n个字符为字符串str
	str05.replace(6, 5, "C/Cpp");
	cout << str05 << endl;
}

int main()
{
	test();
	return 0;
}

输出结果

我爱北京

3.1.2.5 string查找和替换

int find(const string& str, int pos = 0) const;  //查找str第一次出现位置,从pos开始查找

int find(const char* s, int pos = 0) const;        //查找s第一次出现位置,从pos开始查找

int find(const char* s, int pos, int n) const;  //从pos位置查找s的前n个字符第一次位置

int find(const char c, int pos = 0) const;          //查找字符c第一次出现位置

int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找

int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找

int rfind(const char* s, int pos, int n) const;    //从pos查找s的前n个字符最后一次位置

int rfind(const char c, int pos = 0) const;         //查找字符c最后一次出现位置

string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str

string& replace(int pos, int n, const char* s);        //替换从pos开始的n个字符为字符串s

void test()
{
	//查找
	string str04 = "abcdef";
	int pos = str04.find("abc");
	if (pos == -1)
	{
		cout <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值