1.string是表示字符串的字符串类
2.该类的接口与常规容器的接口基本相同。
string类对象的常见构造
void TestString()
{
string s1;//构造一个string空类对象s1
string s2("hello bit");//用c字符串的形式构造一个string类s2
string s3(10, 'a');//用10个字符‘a’构造string类对象s3
string s4(s2);//拷贝构造s4
string s5(s3, 5);//用s3中前5个字符构造string对象s5
}
string类对象的容量操作
void TestString1()
{
string s("hello world");
//string s;
cout << s.length() << endl;
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
//将s中的字符串清空,注意情空时只是将size清0,不改变底层空间的大小
s.clear();
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
//将s中有效字符个数增加到10个,多出位置用‘a’进行填充
//‘aaaaaaaaaa’
s.resize(10,'a');
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
//将s中有效字符个数增加到15个,多出位置用缺省值‘\0’进行填充
//'aaaaaaaaaa\0\0\0\0\0'
//注意此时s中有效字符个数已经增加到15个
//s.resize(15,'1');
s.resize(15);
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
//将s中的有效字符个数缩小到5个
s.resize(5);
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
//增大
s.resize(16);
cout << s.size() << endl;
cout << s.capacity() << endl;
cout << s << endl;
}
void TestString2()
{
string s;
//测试reserve是否会改变string中有效元素的个数
s.reserve(100);
cout << s.size() << endl;
cout << s.capacity() << endl;
//测试resever参数小于string的底层大小时,是否会将空间缩小
s.reserve(50);
cout << s.size() << endl;
cout << s.capacity() << endl;
}
1.size()与length()方法底层实现原理完全相同,引入size的原因是为了与其他容器接口保持一致。
2.clear只是将string中有效字符清空,不改变底层空间大小。
3.resize(size_t n,char c)将字符串中的有效字符个数改变为nge,用字符c来填充多出来元素,当元素个数增多,可能会改变底层容量的大小。
4.reserve,为string预留空间,不改变有效元素的个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。reserve就是一个增容作用,自动增容,第一次扩大2倍,后续按1.5倍增容。提高了效率,减少了增容的操作。
string类对象的访问操作
void TestString()
{
string s1("hello world");
const string s2("hello world");
cout<<s1<< " "<< s2 << endl;
cout << s1[0] << " " << s2[0] << endl;
s1[0] = 'H';
cout << s1 << endl;
for (size_t i = 0; i < s1.size(); i++)
{
cout << s1[i] << endl;
}
//s2[0]='H' ; 编译失败,因为const类型对象不能修改
}
string类对象的修改操作
void TestString()
{
string s1("hello world");
const string s2("hello world");
cout<<s1<< " "<< s2 << endl;
cout << s1[0] << " " << s2[0] << endl;
s1[0] = 'H';
cout << s1 << endl;
for (size_t i = 0; i < s1.size(); i++)
{
cout << s1[i] << endl;
}
//s2[0]='H' ; 编译失败,因为const类型对象不能修改
}
void TestString2()
{
string str;
str.push_back(' ');//在str后面插入空格
str.append("hello");//在str后面追加一个字符串hello
str += 'b';//在str后追加一个字符‘b’
str += "it";//在str后追加一个字符串“it”
cout << str << endl;
cout << str.c_str() << endl;//以c语言的方式来打印字符串
//获取file的后缀
string file("string.cpp");
size_t pos = file.rfind('.');//从后开始找字符为.
string suffix(file.substr(pos, file.size() - pos));//截取字符串
cout << suffix << endl;
//nops是string里面的一个静态成员变量
//static const size_t npos=-1;
//取出url中的域名
//url统一资源定位符
string url("http://www.cplusplus.com/reference/string/string/find/");
cout << url << endl;
size_t start = url.find("://");//找到://的位置
if (start == string::npos)
{
cout << "invalid url" << endl;
return;
}
start += 3;
size_t finish = url.find('/', start);//从start位置开始找到第一个/的位置
string address = url.substr(start, finish - start);
cout << address << endl;
//删除url的协议前缀
pos = url.find("://");
url.erase(0, pos + 3);
cout << url << endl;
}
//利用reserve提高插入数据的效率,避免增容带来的开销
//
void TestPushBack()
{
string s;
size_t sz = s.capacity();
cout << "making s grow:\n";
for (int i = 0; i < 100; ++i)
{
s += 'c';
cout << s << endl;
if (sz != s.capacity())
{
sz = s.capacity();
cout << "capacity changed:" << sz << '\n';
}
}
}
1.在string尾部追加字符时,s.push_back / s.append() /s+=‘'三种的实现方式差不多,一般情况下string类的+=操作比较多,+=操作不仅可以连接单个字符,还还可以连接字符串。
2.对string操作,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。