小言_互联网的博客

C++string容器详解

495人阅读  评论(0)

1.概述:

string是C++风格的字符串,而string本质上是一个
string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char*表示的。string与char*都可以用来表示字符串,不过二者之间也有差别
1.char*是一个指针
2.string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器

2.string的构造函数

构造函数原型:

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

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

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

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

示例:

#include<iostream>
#include<string>
using namespace std;
void test()
{
   
	//创建空字符串
	string s1;//默认构造
	//使用字符串s初始化
	const char*s = "abc";
	string s2(s);
	cout << "s2=" << s2<<endl;
	//拷贝构造
	string s3(s2);
	cout << "s3=" << s3<<endl;
	//用n个某字符来初始化
	string s4(5, 'a');
	cout << "s4=" <<s4<<endl;

}
int main()
{
   
	test();
	system("pause");
	return 0;
}

3.string的赋值操作

赋值的函数原型:

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

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

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

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

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

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

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

示例:

#include<iostream>
#include<string>
using namespace std;
//字符串赋值
void test()
{
   
	string s1;//用的较多
	s1 = "abcd";
	cout <<"s1="<< s1 << endl;
	string s2 = s1;
	cout << "s2="<<s2 << endl;
	string s3;
	s3= 'a';
	cout << "s3=" << s3 << endl;
	string s4;
	s4.assign("hello c++");
	cout << "s4 = " << s4 << endl;
	string s5;
	s5.assign("hello world");
	cout << "s4=" << s5 << endl;
	string s6;
	s6.assign(s5);
	cout << "s6=" << s6 << endl;
	string s7;
	s7.assign(10,'a');
	cout << "s7=" << s7 << endl;

}
int main()
{
   
	test();
	system("pause");
	return 0;
}

4.string的拼接操作

目的:实现在字符串末尾拼接字符串
函数原型:

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

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

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

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

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

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

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

示例:

#include<iostream>
#include<string>
using namespace std;
//string字符串的拼接
void test()
{
   
	string s1 = "我";
    s1 += "爱玩游戏";
	cout << "s1=" << s1 << endl;
	s1 += ':';
	cout << "s1=" << s1 << endl;
	string s2="LOL";
	s1 += s2;
	cout << "s1=" << s1 << endl;
	string s3 = "I ";
	s3.append("love ");
	cout << "s3=" << s3 << endl;
	s3.append("you LOL", 1);
	cout << "s3=" << s3 << endl;
	string s4 = "ou";
	s3.append(s4);
	cout << "s3=" << s3 << endl;
	s3.append(s3, 7, 3);
	cout << "s3=" << s3 << endl;

}
int main()
{
   
	test();
	system("pause");
	return 0;
}

运行结果:

5.string的子串获取操作

s.substr(pos,n)
返回一个string,包含s中从pos开始的n个字符的拷贝,pos的默认值为0

示例:

#include<iostream>
#include<string>
using namespace std;
//子串的获取
void test()
{
   
	string s1 = "abcd";
	string substr = s1.substr(1, 3);//从s1的位置1开始获取3个字符
	cout << substr << endl;
	string s2 = s1.substr(1, 5);//开始位置加计数值超过string的大小,substr会调整计数值,只拷贝到string的末尾,不会报错
	//string s = s1.substr(5, 3);
    //开始位置超过了string的大小,substr函数抛出一个out_of_range 异常	
	cout << s2 << endl;
}
//实用操作
void test2()
{
   
	string email = "zhangsan@qq.com";
	int p = email.find('@');
	string s2 = email.substr(0, p);
	cout << s2 << endl;

}
int main()
{
   
	test();
	test2();
	system("pause");
	return 0;
}

运行结果:

6.string的插入与删除

插入:s.insert(pos,args)
在pos前插入args指定的字符

删除:s.erase(pos,len)
删除从位置pos开始的len个字符,如果省略len,则删除从pos开始直至s末尾的所有字符

示例:

#include<iostream>
#include<string>
using namespace std;
//字符串的插入与删除
void test()
{
   
	string s1 = "hel world";
	//插入
	string s2 = "hello";
	s1.insert(3, "lo");//插入起始位置,插入内容
	cout << s1 << endl;
	//在s1[0]之前插入s2中从s2[0]开始的s2.size()个字符
	s1.insert(0, s2, 0, s2.size());
	cout << s1 << endl;
	//删除
	s1.erase(0, 6);//删除起始位置,删除多少个
	cout << s1<<endl;
}

int main()
{
   
	test();
	system("pause");
	return 0;
}

运行结果:

7.string的替换与查找字符操作

查找:s.find(args)或s.rfind(args)

s.find为从左向右查找,查找第一次args出现的位置
s.rfind为从右向左查找,查找最后一次args出现的位置

注意:查找返回的是一个unsigned int类型,用int接收并不明智

替换:s.replace(range,args)

删除s中范围range内的字符,替换为args指定的字符
replace操作是调用erase和insert的简化形式

示例:

#include<iostream>
#include<string>
using namespace std;
//字符串的查找
void test()
{
   
	string s1 = "abcdefgde";
	auto find = s1.find("de");//默认从0开始查找 返回整形
	if (find == -1)
	{
   
		cout << "没找到字符串" << endl;//没找到子串返回-1
	}
	else
	{
   
		cout << "find=" << find << endl;
	}
	//如果我们要搜索第一个不在参数中的字符,我们应该调用find_first_not_of
	string S = "asdasfgvc23";
	string S1 = "ads01234";
	auto pos = S.find_first_not_of(S1);//返回5(f)
	cout << pos << endl;
	//rfind从右往左查找 find 从左往右查找
	auto rfind = s1.rfind("de");
	cout << "rfind=" << rfind << endl;
}
//替换
void test2()
{
   
	string s1 = "123456789";
	//从第一个位置(2)替换3个字符(234)为"1111"
	s1.replace(1, 3, "1111");
	//等价于s1.erase(1,3);
	//s1.insert(1,3,"1111");
	cout << "替换后:" << s1 << endl;
}
int main()
{
   
	test();
	test2();
	system("pause");
	return 0;
}

运行结果:

8.string的字符串比较操作与尾插操作

字符串比较:s.compare(s1)
s与s1相等返回0,s>s1返回大于0的值,s<s1返回一个小于0的值

尾插:s.append(args)
将args追加到s,返回一个指向s的引用

示例:

#include<iostream>
#include<string>
using namespace std;
//字符串比较
//与strcmp类似
void test()
{
   
	//ASCII码逐个对比
	string s1 = "hello world";
	string s2 = "hello world";
	if (s1.compare(s2) == 0)
	{
   
		cout << "s1=s2" << endl;
	}
	else if (s1.compare(s2) > 0)
	{
   
		cout << "s1>s2" << endl;
	}
	else
	{
   
		cout << "s1<s2" << endl;
	}

}
//字符串尾插
void test2()
{
   
	string s = "hello ";
	string s1 = s;
	s.append("world");
	cout << s << endl;
	//等价于
	s1.insert(s1.size(), "world");
	cout << s1 << endl;
}
int main()
{
   
	test();
	test2();
	system("pause");
	return 0;
}

运行结果:

9.string字符存取操作

string中单个字符存取方式有两种

1.char& operator[](int n); //通过[]方式取字符
2.char& at(int n); //通过at方法获取字符

示例:

#include<iostream>
#include<string>
using namespace std;
void test()
{
   
	int i = 0;
	string s1 = "abcd";
	//用[]访问单个字符
	for (i = 0; i < s1.size(); i++)
	{
   
		cout << s1[i] << " ";
	}
	cout << endl;
	//用at访问
	for (i = 0; i < s1.size(); i++)
	{
   
		cout << s1.at(i) << " ";
	}
	cout << endl;
	//修改单个字符
	s1[0] = 'b';
	cout << s1 << endl;
	s1.at(2) = 'b';
	cout << s1 << endl;

}
int main()
{
   
	test();
	system("pause");
	return 0;
}

运行结果:


转载:https://blog.csdn.net/hbbfvv1h/article/details/115598447
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场