string介绍
string的构造
模板库是使用类来封装的, 所以每个容器都可以看成是一个独立的类. 既然有了类, 那么就会有构造函数了.string类也是通过构造函数来进行实例化的.
string常用的构造函数有:
string();//构造一个空的string类对象
string(const char* s);//用C风格字符串构造string类对象
string(size_t size,char c);//构造一个string类对象, 包含size个c字符
string(const string& s);//通过拷贝构造string类对象
string申请的是堆上的空间, 所以STL提供了一些函数让我们获取它的容量属性:
string s;
s.size();//获取有效字符串长度
s.length();//同上,没有区别
s.capacity(); //获取空间总大小,空间会自动扩容,不需要我们操作
s.empty();//判断字符串是否为空
s.clear();//清空有效字符
s.reserve(x);//为字符串预留x个字节的空间
s.resize(size_t n, char c);//改变有效字符个数到n个,增加时,使用c来进行填充,
//如果没有参数c,就用0来填充,
//有效字符增加可能会产生扩容
string的迭代器和访问操作
string可以使用迭代器对数据进行访问:
string s("kishere");
string::iterator it;//定义一个string类对象的迭代器(正向)
同时, string还提供了一些操作让我们更方便地对数据进行访问:
s[1];//获取第二个位置的字符
it = s.begin();//获取第一个位置的迭代器
string::reverse_iterator rit;//定义一个string类对象的迭代器(反向)
it = s.end();//获取最后一个字符下一个位置的迭代器
it = s.rbegin();//获取最后一个字符位置的反向迭代器
it = s.rend();//获取第一个位置的反向迭代器
迭代器支持’++’, '- -'操作来获取下一个位置, 但是要注意的是反向迭代器++是获取当前字符的前一个字符.
string的修改
通过STL提供的相关函数可以进行相关的修改操作.
s.pushback('C');//向string类对象s的末尾插入字符C
s.append(str);//向string类对象s末尾追加字符串str
s+=str;//同上
s.c_str();//将string类对象s转为c_str返回
深拷贝
在类和对象中我们讨论了关于浅拷贝的问题. 在类中有资源管理时, 使用默认的拷贝构造函数. 拷贝和被拷贝的两个指针指向同一块内存空间, 在释放内存时, 会使内存被释放两次, 导致程序崩溃. 这就是所谓的浅拷贝.
在涉及资源管理的类中, 拷贝构造函数必须显式给出:
class string{
public:
string(const string& s)
:_str(new char[strlen(s._str)+1])
{
strcpy(_str,s._str);
}
private:
char* _str;
}