string容器——STL

文章目录

      • string容器
          • 构造函数(创建string)
          • **赋值**('=' 和 assign())
          • **存取**([ ] 和 at( ))
          • 拼接(+= 和 append())
          • 查找(find())
          • 替换(replace())
          • 比较(compare())
          • 字串(substr)
          • 上面内容总结:解析字符串
          • 插入和删除操作(insert(),erase())
          • string和c-style字符串转换
          • 小写变大写(toupper() / tolower())
      • 小提示

string容器



构造函数(创建string)

string(const string& str);//1
string(const char*s);//2
string(int n,char c);//3

int main()
{
    string str;
    string str2(str);//1
    string str3 = "abc";//2
    string str4(10,'a');//3  10个字符a
}


赋值(’=’ 和 assign())

有两种方式,一种就是通过**=**来赋值,另一种就是通过assign()来赋值。

 void test01()
{
	string str;
	str = "abc";//abc
	str.assign("abc");//abc
	str.assign("abc", 1);//a
	string str2;
	str2.assign(str);//a
	str2.assign(5, 'a');//aaaaa
	str2.assign("abc", 0, 2);//ab  从0号位置开始去,拿走两个
	//cout << str << endl;
	cout << str2 << endl;
}

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


存取([ ] 和 at( ))
string str = "abcd";
//如何获得字符串长度进而打印字符串呢?是不能使用strlen()的,这个函数的参数是char*而不是string。
//string中专门维护着求字符串长度的方法
int length = str.size()
int main()
{
    string str = "abcde";
    int length = str.size();
    cout << length << endl;
    for (int i = 0; i < length; i++)
    {
        cout << str[i] << " ";//用中括号
        cout << str.at(i) << " ";//用at()函数
    }
    return 0;
}

用两种方法都可以索引到相应的数据

区别:如果使用[ ]不小心越界,那么会直接挂掉;如果使用at(),不会直接挂掉,而是抛出一个异常(out_of_range).

如果使用中括号,如果出错,使用try,catch也不会捕获到异常,而是直接挂掉。

int main()
{
    string str = "12345";
    try
    {
        cout << str.at(100) << endl;
    }
    catch (out_of_range e)
    {
        cout << e.what() << endl;//系统打印的结果invalid string position
    }
    /*
    catch(...)
    {
        cout<<"捕获到了异常"<
    return 0;
}


拼接(+= 和 append())
int main()
{
    string str1 = "I LOVE ";
    string str2 = "YOU";

    //str1 += str2;
    str1.append(str2);
    
    return 0;
}


查找(find())
int main()
{
	string str = "abcdefg";
	cout << str.find("de") << endl;//返回的是首字符的数组下标
	
	return 0;
}
int main()
{
	string str = "abcdefg";
	int pos = str.find("cd");
	if (pos == -1)//一般都有判断语句
	{
		cout << "没有找到" << endl;
	}
	else
	{
		cout << "下标位置是:" << pos << endl;
	}
	return 0;
}

如果是rfind(),就是从右往左找到符合的字符,然后再输出其下标(下标是不变的)。正常情况下rfind和find的用法是一样的 ,但是如果有同样满足的字符的时候,距离左边近的就用find,距离右边近的就用rfind。

int pos = str.find('@',1);
//从下标为1的地方开始寻找@,这个用的比较多。


替换(replace())
int main()
{
	string str = "abcdefgc";
	str.replace(1, 3, "1111");//替换从1开始的3个字符为"1111";
	cout << str << endl;
	return 0;
}


比较(compare())
int main()
{
	string str = "abcd";
	string str2 = "abcd";
	if (str.compare(str2) == 0)
	{
		cout << "字符串相等" << endl;
	}
	else if (str.compare(str2) > 0)
	{
		cout << "str字符串比较大" << endl;
	}
	else if (str.compare(str2) < 0)
	{
		cout << "str2字符串比较大" << endl;
	}
	
	return 0;
}


字串(substr)
int main()
{
	string str = "abcd";
	string str2 = str.substr(0, 3);//返回由下标0开始的3个字符组成的字符串
	return 0;
}

来个小例题:从电子邮件中将用户名截出来。(zhangsan@outlookcom 中截出zhangsan)

int main()
{
	string str = "zhangsan@outlookcom";
	int pos = str.find('@');
	string substr = str.substr(0, pos);
	cout << substr << endl;
	return 0;
}


上面内容总结:解析字符串

例题:将字符串ww.baidu.com.cn中的单词ww baidu com cn截取到vector容器中。

int main()
{
	string str = "ww.baidu.com.cn";
	vector<string> v;

	int start = 0;

	int pos = -1;

	while (true)
	{
		pos = str.find('.',start);
		if (pos == -1)
		{
			string substr2 = str.substr(start, str.size() - start);
			v.push_back(substr2);
			break;
		}
		string substr1 = str.substr(start, pos-start);
		start = pos + 1;
		v.push_back(substr1);
	}

	for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << endl;
	}
	
	return 0;
}


插入和删除操作(insert(),erase())

string& insert(int pos,const char* s);在指定位置插入字符串

string& insert(int pos,const char* s);在指定位置插入字符串

string& insert(int pos,int n, char c);在指定位置插入n个c字符

string& erase(int pos,int n );从指定位置开始删除n个字符

int main()
{
	string str = "hello";
	str.insert(1, "111");//在指定的下标位置前插入字符串:h111ello

	str.erase(1, 3);//删除从下标位置开始的3个字符(包括下标位置):hello

	return 0;
}


string和c-style字符串转换
int main()
{
	const char* str = "abcd";
	//将const chat* 转为 string
	string s(str);//有参构造
	cout << s << endl;
	return 0;
}
int main()
{
	string str = "hello";
	//将string 转为 const char*
	const char* str2 = str.c_str();
	return 0;
}

参数类型的转换

void func(string s)
{
}

int main()
{
    const char* str = "hello";
    func(str);
    return 0;
}
//以上写法是没有错的,const char*可以隐式转换为string
void func2(const char * s)
{
}
int main()
{
    string str 	= "hello";;
    func2(str);
    return 0;
}
//以上的写法就会报错。string不能隐式类型转换为const char*

string类中是维护着已给const char*的。某种意义上,string>const char *



小写变大写(toupper() / tolower())

就是将所有的字符都变成大写。

需要使用toupper()函数

int main()
{
	string str = "abcDeF";
	for (int i = 0; i < str.size(); i++)
	{
		str[i] = toupper(str[i]);
        //如果是大写变小写:str[i] = tolower();
    }
	cout << str << endl;
	return 0;
}

如果是大写变小写,需要使用tolower()函数




小提示

如果想修改string字符串的内容,那么如果使用[ ]和 at( )返回字符的引用(准备用引用修改值),然后才能修改。但是如果当字符串的内存被重新分配了以后,可能会发生错误。

你可能感兴趣的:(STL,c++,c语言,开发语言,算法)