C++STL详解(一)—string类

C++SLT详解(一)—string类

  • string类的常见构造
  • string类对象的容量操作
  • string类对象的访问及其遍历操作
  • string类的修改操作
    • string类的字符添加
    • string类的删除
    • string类的查找
    • string类中子字符串的提取
    • string类操作符
  • string类中的getline函数

string类的常见构造

string类可以实现多个构造函数的重载,下列是常见构造函数使用事例。

string s1;            //构造一个空的字符串。
string s2("hello"); //编译器经过优化后利用字符串直接对s2进行构造
string s3(100, 'x');     //对s3构造n个字符。
string s4("hello", 2);   //从字符串的位置和个数对s4进行构造。
string s5(s4, 1, 3);     //对string s4指定位置和字符个数对s5进行初始化。

string类对象的容量操作

size 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty 检测字符串释放为空串,是返回true,否则返回false
clear 清空有效字符
reserve 为字符串预留空间,防止频繁扩容,降 低效率
resize 将有效字符的个数该成n个,多出的空间用字符c填充

string类对象的访问及其遍历操作

1:string类对operator[]进行重载,并且因为该重载为引用返回,我们可以通过下标[]进行访问修改下标所对应的元素。

void Teststring()
{
	string s("hello");
	string s1("hello CSDN");
	for (size_t i = 0; i < s.size(); ++i)
	{
		cout << s[i] << endl;  //对s1进行访问。
	}

	for (size_t i = 0; i < s.size(); ++i)
	{
		 s1[i] = 'x';   //对s1进行访问修改;
	}
	cout << s1 << endl;
}

}

2:使用范围for访问类对象
范围for的底层其实就是迭代器(类似指针遍历),它能自动迭代,自动判断结束,常用来遍历数组等数据结构。当我们使用范围for修改对象时,要取对象s的引用进行修改。

using namespace std;
void Teststring()
{
	string s("hello");
	for (auto ch : s)    //依次将类s中的每个元素赋值给变量ch后进行访问。
	{
		cout << ch << ' ';//输出;
	}
	for (auto& ch : s)  //取自动迭代对s进行赋值访问;
	{
		ch = 'x';  
	}
	cout << s << endl;
	
}
int main()
{
	Teststring();
	return 0;
}

3:使用迭代器进行访问

void Teststring()
{
	string s("111");
	string::iterator it = s.begin();//字符串的指向第一个位置的指针赋值给迭代器it;
	while (it != s.end()) //it不能等于字符串指向最后一个位置的下一个位置的地址
	{
		cout << *it << endl;
		++it;
	}

	it = s.begin();          //重新对it进行赋值。
	while (it != s.end())     //使用it进行访问并进行修改。
	{
		*it+= 1;
		it++;
	}
	cout << s << endl; //输出222;
}

string类的修改操作

string类的字符添加

1:使用push_back进行尾插

void Teststring()
{
	string s("hello");
	s.push_back('1');
	cout << s << endl;
}


2:使用append函数在字符串后面追加一个字符串。

void Teststring()
{
	string s("hello");
	s.append(" CSDN");
	cout << s << endl;
}



3:使用insert指定位置和字符串插入string类中。

void Teststring()
{
	string str("can you see?");
	for (size_t i = 0; i < str.size(); i++)
	{
		if (str[i] == ' ')
		{
			str.insert(i, "20%");  //在string空格处插入字符串;
		//	i += 3;//void Teststring()
{
	string str("can you see?");
	for (size_t i = 0; i < str.size(); i++)
	{
		if (str[i] == ' ')
		{
			str.insert(i, "20%");  //在string空格处插入字符串;
			i += 3;
		}
	}
	cout << str << endl;
}

注意: 插入字符串时,’ ‘处也会发生后移,如果 不执行代码 i += 3;以及循环内 i++,跳过后移过的’’ '时,程序会一直在第一个‘ ’插入20%,一直后移,导致程序崩溃。

string类的删除

1:使用erase函数指定位置和个数进行删除。

void Teststring()
{
	string s("hello");
	s.erase(2);
	cout << s << endl;
}


2:使用pop_back进行尾删

void Teststring()
{
	string s("hello");
	s.pop_back();
	cout << s << endl;
}


string类的查找

1:find ,指从字符串pos位置开始往后找字符C,并返回该字符的位置。

void Teststring()
{
	string url1 = "http://www.cplusplus.com/reference/string/string/find/";
	size_t pos1 = url1.find("://");
	if (pos1 == string::npos)  //npos 为类string的静态成员变量;
	{
		cout << " fin url1 false" << endl;
		return;
	}
	cout << pos1 << endl;
	
}

int main()
{
	Teststring();
}

2rfind从字符串的右侧开始匹配对应字符C,并返回该字符的位置。如果指定位置,便会从指定位置开始查找,否则便会从字符串的首位置查找。

using namespace std;
void Teststring()
{
	string url1 = "http://www.cplusplus.com/reference/string/string/find/";
	size_t pos1 = url1.	rfind("://");
	if (pos1 == string::npos)  //npos 为类string的静态成员变量;
	{
		cout << " fin url1 false" << endl;
		return;
	}
	cout << pos1 << endl;  //输出的位置下标与rfind一样不变,只是寻找的方向变化了。
	
}

string类中子字符串的提取

substr函数可以指定目标子字符串的首位置,以及首位置到目标尾位置之间的字符个数来提取子字符串。

using namespace std;
void Teststring()
{
	string url1 = "http://www.cplusplus.com/reference/string/string/find/";
	size_t pos1 = url1.	rfind("://");
	if (pos1 == string::npos)  //npos 为类string的静态成员变量;
	{
		cout << " fin url1 false" << endl;
		return;
	}
	size_t pos2 = url1.find('/',pos1 +3); //注意从pos + 3的位置后一个字符一个字符的查找。  
	if (pos2 == string::npos)  
	{
		cout << " fin url1 false" << endl;
		return;
	}
    //提取域名;
    string url2=url1.substr(pos1 + 3, pos2-pos1-3);
	cout << url2 << endl;
	
}

string类操作符

1:string类进行了操作符重载,可以对strng类 类型进行赋值(=),追加字符串(+=)。但不包含删除(-=)。
2:<< 和 >>对于string类 类型也同样适用。

void Teststring()
{
	string str(" hello CSDN");
	str += "1234";                 //向str字符串尾部追加"1234"
	cout << str << endl;
	str = "xxxx";                  //对字符串str直接赋值。
	cout << str << endl; 
}

string类中的getline函数

当我们用>>输入字符串时,当编译器读取空格或者’\n’时会结束当前输入。为了避免这一状况,我们可以采用getline函数,此时便可以将空格输入到string str对象中。

using namespace std;
void Teststring()
{
	string str;
	getline(cin, str);
	size_t pos = str.find(' ');
	if (pos != string::npos)
	{
		cout << str.size() - 1 - pos << endl;
		return;
	}
}

你可能感兴趣的:(C++,c++)