1、string是什么
string是专门对字符串操作的一个类。
2、string和char*的区别
char*是指向字符数组的指针,然后系统提供了一个string.h,这个头文件声明了很多字符串操作函数。
string则是一个类,这个类将以上的内容封装在一起,使得字符串的操作更灵活,方式更多、管理更灵活
string这个类。我们使用的时候不用考虑内存的分配与释放,不用担心越界崩溃。因为前辈在封装string的时候,已经把几乎所有情况都考虑到并处理了。
3、string构造函数
- string() 无参的构造函数,示例:string str;
string类中存在一个指向字符串的指针(char* m_str)。如果调用无参的构造函数,该指针并不是指空,而是申请了一个字符的空间,写入‘\0’,即为表示一个空的字符串。具体实现类似如下:
class mystring
{
public:
mystring()
{
m_str = new char('\0');
}
const char* c_str() const
{
return m_str;
}
private:
char* m_str;
};
- string(size_t length, char ch),构造一个length个ch组成的字符串
string str(5, 'a');
cout << str.c_str(); //此时str为"aaaaaa",故输出aaaaaa
- string(const char* str) 用字符串进行初始化
- string(const char* str, size_t length) 用str的前length个字符组成字符串进行初始化
- string(string &str, size_t index, size_t length)用str的从index开始数length个字符组成字符串进行初始化(该方法为拷贝构造)
- string(string &str)用str构造对象
4、析构函数
string类析构函数主要需要释放装入字符串的饿空间。类似实现如下:
~mystring()
{
if (NULL != m_str)
{
delete[] m_str;
}
}
5、string重载的运算符
- <<(可以通过<<直接输出string类型数据(对象))
- >> (输入)
- 赋值:+=、=
- 下标运算:[]
- 比较:==、>、<、>=、<=、!=
- 计算:+
6、输出
输出整个字符串:
- 通过<<输出。
- 通过调用c_str()成员函数进行输出。该函数的功能申请一块新的空间备份该字符串,然后返回该备份的首地址。
输出单个字符:
- 通过 [ ] 进行输出指定字符。该方法下标越界会崩溃
- 通过调用at(size_t index)成员函数进行输出。越界会抛出异常
7、修改
- 修改指定元素:用[ ] 和 at()方法进行修改
- 中间插入:insert系列方法
basic_string &insert(size_t index, const basic_string &str); //在index位置插入str
basic_string &insert(size_t index, const char* str); //在index位置插入一个字符串
basic_string &insert(size_t index1, const basic_string &str,size_t index2, size_t num); //在index1的位置插入另一对象的某一部分
basic_string &insert(size_t index, size_t num, char ch); //在index处插入num个ch
- 尾巴插入
+= :可以拼接对象、拼接字符串
basic_string &append(const basic_string &str); //在尾部拼接一个对象
basic_string &append(const char* str); //尾部拼接一个字符串
basic_string &append(const basic_string &str, size_t index, size_t len); //拼接一个对象的某一段
basic_string &append(const char* str, size_t num); //拼接字符串前几个
basic_string &append(size_t num, char ch); //拼接num个ch
8、基本操作
- 比较
1、比较运算符重载
> < != == >= <=
2、比较两个对象
int compare(const string &str);
3、比较一个对象和字符串
int compare(const char* str);
4、比较本对象的一段跟参数3的对象
int compare(size_t index, size_t length, const string &str);
5、比较两个对象中的一段
int compare(size_t index, size_t length, const string &str, size_t index2, size_t, length2);
- 复制
1、将对象中的某一段复制进一个字符数组中。
size_t copy(char *str, size_t num, size_t index);
- 查找字串
1、从指定位置开始查找str,找到就返回起始位置
size_t find(const string &str, size_t index);
2、指定位置查找一个字符串
size_t find(const char* str, size_t index);
3、指定位置开始查找字符
size_t find(char ch, size_t index);
4、返回字串,返回指定为位置的字串
substr(size_t index, size_t num);
5、交换两个对象的内容
swap(string &str);
9、迭代器
- 定义一个迭代器
string::iterator ite;//类似于一个char*指针
- 通过迭代器遍历string元素
string str1 = "abcdefg";
string::iterator ite;
ite = str1.begin();
for (int i = 0; i < str1.size(); i++)
{
cout << *ite;
//或者cout << ite[i];
ite++;
}
- 迭代器和指针的使用方法相同
- 为什么要用迭代器
因为这个迭代器是要跟算法连接的,它适用于所有的容器。
- 迭代器失效
在string重新申请内存时,迭代器失效。
string str = "abc";
string::iterator ite;
ite = str.begin();
str.append(18, 'a');
ite[3] = '3';//会出错
10、string涉及到迭代器的成员函数
1、函数返回一个迭代器,指向字符串的第一个元素
iterator begin();
2、函数返回一个迭代器,指向字符串的末尾元素(最后一个元素的下一个)
iterator end();
3、在字符串的末尾添加以迭代器start和end表示的字符串
append(iterator start, iterator end);
4、删除
iterator erase(iterator pos);//删除指定元素
iterator earse(iterator start, iterator end);//删除一段
5、插入
void insert(iterator i, size_t num, const char &h);
void insert(iterator i, iterator start, iterator end);
11、string与算法
- 遍历
//头文件
# include<algorithm>
void fun(char c)
{
cout << c;
}
string str("sdbdfbdawv");
for_each(str.begin(), str.end(), fun);
- 排序
# include<algorithm>
# include<functional>//great的头文件
string str = "ddfbrgtbadf";
sort(str.begin(), str.end());//默认从小到大排序
sort(str.begin(), str.end(), greater<char>());指定从大到小排序