string容器全(C++)

发布时间:2024年01月21日

string 是字符容器,内部维护了一个动态的字符数组。
与普通的字符数组相比,string 容器有三个优点:

1)使用的时候,不必考虑内存分配和释放的问题;

2)动态管理内存(可扩展);

3)提供了大量操作容器的 API。缺点是效率略有降低,占用的资源也更多。
string 类是 std::basic_string 类模板的一个具体化版本的别名。
using std::string=std::basic_string<char, std::char_traits<char>, std::allocator<char>>

最重要的是:别背

一、构造和析构

静态常量成员 string::npos 为字符数组的最大长度(通常为 unsigned int 的最大值);
NBTS(null-terminated string):C 风格的字符串(以空字符 0 结束的字符串)。

1)string(); // 创建一个长度为 0 的 string 对象(默认构造函数)。
2)string(const char *s); // 将 string 对象初始化为 s 指向的 NBTS(转换函数)。
3)string(const string &str); // 将 string 对象初始化为 str(拷贝构造函数)。
4)string(const char *s,size_t n); // 将 string 对象初始化为 s 指向的地址后 n 字节的内容。
5)string(const string &str,size_t pos=0,size_t n=npos); // 将 sring 对象初始化为 str 从位置 pos
开始到结尾的字符(或从位置 pos 开始的 n 个字符)。
6)template<class T> string(T begin,T end); // 将 string 对象初始化为区间[begin,end]内的字符,
其中 begin 和 end 的行为就像指针,用于指定位置,范围包括 begin 在内,但不包括 end。(迭代器)

7)string(size_t n,char c); // 创建一个由 n 个字符 c 组成的 string 对象。
析构函数~string()释放内存空间。

C++11 新增的构造函数:

1)string(string && str) noexcept:它将一个 string 对象初始化为 string 对象 str,并可能修改 str
(移动构造函数)。
2)string(initializer_list<char> il):它将一个 string 对象初始化为初始化列表 il 中的字符。
例如:string ss = { 'h','e','l','l','o' };

二、特性操作

1)size_t max_size() const; // 返回 string 对象的最大长度 string::npos,此函数意义不大。
2)size_t capacity() const; // 返回当前容量,可以存放字符的总数。
3)size_t length() const; // 返回容器中数据的大小(字符串语义)。
4)size_t size() const; // 返回容器中数据的大小(容器语义)。
5)bool empty() const; // 判断容器是否为空。
6)void clear(); // 清空容器,清空后,size()将返回 0。
7)void shrink_to_fit(); // 将容器的容量降到实际大小(需要重新分配内存)。
8)void reserve( size_t size=0); // 将容器的容量设置为至少 size。
9)void resize(size_t len,char c=0); // 把容器的实际大小置为 len,如果 len<实际大小,会截断多出
的部分;如果 len>实际大小,就用字符 c 填充。resize()后,length()和 size()将返回 len。

三、字符操作

1)char &operator[](size_t n);
2)const char &operator[](size_t n) const; // 只读。
3)char &at(size_t n);
4)const char &at(size_t n) const; // 只读。
5)operator[]和 at()返回容器中的第 n 个元素,但 at 函数提供范围检查,当越界时会抛出 out_of_range异常,operator[]不提供范围检查。
6)const char *c_str() const; // 返回容器中动态数组的首地址,语义:寻找以 null 结尾的字符串。

7)const char *data() const; // 返回容器中动态数组的首地址,语义:只关心容器中的数据。
int copy(char *s, int n, int pos = 0) const; // 把当前容器中的内容,从 pos 开始的 n 个字节拷贝
到 s 中,返回实际拷贝的数目。

四、赋值操作

给已存在的容器赋值,将覆盖容器中原有的内容。
1)string &operator=(const string &str); // 把容器 str 赋值给当前容器。
2)string &assign(const char *s); // 将 string 对象赋值为 s 指向的 NBTS。
3)string &assign(const string &str); // 将 string 对象赋值为 str。
4)string &assign(const char *s,size_t n); // 将 string 对象赋值为 s 指向的地址后 n 字节的内容。
5)string &assign(const string &str,size_t pos=0,size_t n=npos); // 将 sring 对象赋值为 str 从
位置 pos 开始到结尾的字符(或从位置 pos 开始的 n 个字符)。
6)template<class T> string &assign(T begin,T end); // 将 string 对象赋值为区间[begin,end]
内的字符。
7)string &assign(size_t n,char c); // 将 string 对象赋值为由 n 个字符 c。

五、连接操作

把内容追加到已存在容器的后面。
1)string &operator+=(const string &str); //把容器 str 连接到当前容器。
2)string &append(const char *s); // 把指向 s 的 NBTS 连接到当前容器。
3)string &append(const string &str); // 把容器 str 连接到当前容器。
4)string &append(const char *s,size_t n); // 将 s 指向的地址后 n 字节的内容连接到当前容器。
5)string &append(const string &str,size_t pos=0,size_t n=npos); // 将 str 从位置 pos 开始到
结尾的字符(或从位置 pos 开始的 n 个字符)连接到当前容器。
6)template<class T> string &append (T begin,T end); // 将区间[begin,end]内的字符连接到容
器。
7)string &append(size_t n,char c); // 将 n 个字符 c 连接到当前容器。

六、交换操作

void swap(string &str); // 把当前容器与 str 交换。
如果数据量很小,交换的是动态数组中的内容,如果数据量比较大,交换的是动态数组的地址

七、截取操作

string substr(size_t pos = 0,size_t n = npos) const; // 返回 pos 开始的 n 个字节组成的子容器。

八、比较操作

1)bool operator==(const string &str1,const string &str2) const; // 比较两个字符串是否相等。
int compare(const string &str) const; // 比较当前字符串和 str1 的大小。
int compare(size_t pos, size_t n,const string &str) const; // 比较当前字符串从 pos 开始的 n 个
字符组成的字符串与 str 的大小。

2)int compare(size_t pos, size_t n,const string &str,size_t pos2,size_t n2)const; // 比较当前字符
串从 pos 开始的 n 个字符组成的字符串与 str 中 pos2 开始的 n2 个字符组成的字符串的大小。
以下几个函数用于和 C 风格字符串比较。
int compare(const char *s) const;
int compare(size_t pos, size_t n,const char *s) const;
int compare(size_t pos, size_t n,const char *s, size_t pos2) const;
compre()函数有异常,慎用

九、查找操作

size_t find(const string& str, size_t pos = 0) const;
size_t find(const char* s, size_t pos = 0) const;
size_t find(const char* s, size_t pos, size_t n) const;
size_t find(char c, size_t pos = 0) const;
size_t rfind(const string& str, size_t pos = npos) const;
size_t rfind(const char* s, size_t pos = npos) const;
size_t rfind(const char* s, size_t pos, size_t n) const;
size_t rfind(char c, size_t pos = npos) const;
size_t find_first_of(const string& str, size_t pos = 0) const;
size_t find_first_of(const char* s, size_t pos = 0) const;
size_t find_first_of(const char* s, size_t pos, size_t n) const;
size_t find_first_of(char c, size_t pos = 0) const;
size_t find_last_of(const string& str, size_t pos = npos) const;

size_t find_last_of(const char* s, size_t pos = npos) const;
size_t find_last_of(const char* s, size_t pos, size_t n) const;
size_t find_last_of(char c, size_t pos = npos) const;
size_t find_first_not_of(const string& str, size_t pos = 0) const;
size_t find_first_not_of(const char* s, size_t pos = 0) const;
size_t find_first_not_of(const char* s, size_t pos, size_t n) const;
size_t find_first_not_of(char c, size_t pos = 0) const;
size_t find_last_not_of(const string& str, size_t pos = npos) const;
size_t find_last_not_of(const char* s, size_t pos = npos) const;
size_t find_last_not_of(const char* s, size_t pos, size_t n) const;
size_t find_last_not_of(char c, size_t pos = npos) const;

十、替换操作

string& replace(size_t pos, size_t len, const string& str);
string& replace(size_t pos, size_t len, const string& str, size_t subpos, size_t sublen = npos);
string& replace(size_t pos, size_t len, const char* s);
string& replace(size_t pos, size_t len, const char* s, size_t n);
string& replace(size_t pos, size_t len, size_t n, char c);
以下函数意义不大。
string& replace(iterator i1, iterator i2, const string& str);
string& replace(iterator i1, iterator i2, const char* s);
string& replace(iterator i1, iterator i2, const char* s, size_t n);
string& replace(iterator i1, iterator i2, size_t n, char c);

template <class InputIterator>
string& replace(iterator i1, iterator i2, InputIterator first, InputIterator last);

十一、插入操作

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen = npos);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);
string& insert(size_t pos, size_t n, char c);

以下函数意义不大。
iterator insert(iterator p, size_t n, char c);
iterator insert(iterator p, char c);
template <class InputIterator>
iterator insert(iterator p, InputIterator first, InputIterator last);

十二、删除操作

string &erase(size_t pos = 0, size_t n = npos); // 删除 pos 开始的 n 个字符。
以下函数意义不大。
iterator erase(iterator it); // 删除 it 指向的字符,返回删除后迭代器的位置。
iterator erase(iterator first, iterator last); / /删除[first,last)之间的所有字符,返回删除后迭代
器的位置。

文章来源:https://blog.csdn.net/2301_76320385/article/details/135717082
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。