string里常用的函数与讲解使用
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
(点击进入c++关于string 的各个函数的全面讲解使用/英文版)
Iterators(迭代器):
begin与end:
类似下标,字符串的首未;
//迭代器 iterator 可读可写
string::iterator it1 = s1.begin(); //it1 不是指针,有些类似指针
cout << "s1:";
while (it1 < s1.end())
{
*it1 += 1; //可读可写 当有const 修饰的时候,就不可写!
cout << *it1++ << " ";
}
//输出 s1:i b m m p ! h p v ! s j ! e f
当const修饰后:
//const_iterator 只读 不可写 :const 给限制住
const string T2 = "hallo gou ri de";
string::const_iterator it2 = T2.begin();
cout << "s7:";
while (it2 < T2.end())
{
//*it2 += 1; //编译不过! const修饰可读而不可写
cout << *it2++ << " ";
}
//输出: T2:h a l l o g o u r i d e
反向迭代器:
//反向迭代器 普通版本:reverse_iterator 用法与iterator一样
// cosnt修饰:cosnt_reverse_iterator 只读不可改!
// 注意:使用反向迭代的话 要在begin与end 前加上一个r作为与iterator区分;
string s1("hallo gou ri de");
string::reverse_iterator rt2 = s1.rbegin();
while (rt2 != s1.rend())
{
cout << *rt2++ << " ";
}
//输出 :e d i r u o g o l l a h
Capacity(容量):
(长度)size / length :
返回字符串的长度;
(不常用)max_size:
返回字符串可以达到的最大长度
(容量)resize:
(可以用于管理字符串空间大小)
void resize (size_t n); void resize (size_t n, char c);
resize
函数用于调整字符串的长度为n
个字符。
如果n
小于当前字符串长度,当前值会缩短至前n
个字符,去除第n
个字符之后的字符。
如果n
大于当前字符串长度,会在当前内容末尾插入足够多的字符以达到长度为n
。如果指定了字符c
,新添加的元素会初始化为c
的副本,否则新元素会初始化为值初始化的字符(空字符)。
该函数有两个参数:
一是n
,表示新的字符串长度,以字符数量表示,类型为size_t
,与std::string
的成员类型size_type
相同;
二是可选参数c
,用于在字符串扩展时填充新添加的字符空间的字符。函数无返回值。
(容量)capacity:
size_t capacity() const;capacity函数返回当前为字符串分配的存储空间大小,以字节为单位。
这个容量不一定等于字符串的长度,它可以等于或大于字符串长度,额外的空间允许在向字符串添加新字符时进行优化操作。需要注意的是,这个容量并不意味着对字符串长度的限制。当容量耗尽且需要更多空间时,字符串对象会自动扩展(重新分配存储空间)。字符串长度的理论上限由成员函数max_size
给出。字符串的容量可以在对象被修改的任何时候发生改变,即使这种修改意味着尺寸减小或者容量尚未耗尽(这与std::vector
容器中对容量的保证不同)。字符串的容量可以通过调用成员函数reserve
显式地改变。该函数无参数,返回值为当前为字符串分配的存储容量大小,类型为size_t
,与std::string
的成员类型size_type
相同。
(容量)reserve:
void reserve (size_t n = 0);
函数用于请求调整字符串的容量以适应计划的尺寸变化,使其能够容纳最多n
个字符。
reserve
如果n
大于当前字符串的容量,该函数会使容器增加其容量至n
个字符(或更多)。在其他情况下,它被视为一个非约束性的请求来缩小字符串容量,但容器实现可以自由地进行优化并使字符串的容量大于n
。这个函数对字符串的长度没有影响,也不能改变其内容。
该函数有一个参数n
,表示计划的字符串长度,注意最终的字符串容量可能等于或大于n
,参数类型为size_t
,与std::string
的成员类型size_type
相同。函数无返回值。
(清空)clear:
void clear();
clear函数会清空字符串的内容,使其变为一个空字符串(长度为 0 个字符)。该函数无参数,也无返回值。
当 str_clear()清空后 该字符串空间还存在!
(判断) empty:
bool empty() const;
empty
函数用于判断字符串是否为空,即判断其长度是否为 0。这个函数不会以任何方式修改字符串的值。如果要清空字符串的内容,可以使用string::clear
函数。该函数无参数,返回值为布尔类型,如果字符串长度为 0 则返回true
,否则返回false
。
(优化空间)shrink_to_fit:
void shrink_to_fit();
shrink_to_fit
函数请求字符串减少其容量以适应其实际大小。但这个请求是非约束性的,容器实现可以自由地进行优化并使字符串的容量大于其实际大小。这个函数对字符串的长度没有影响,也不能改变其内容。该函数无参数,也无返回值。
Element access(元素访问):
(访问)operator[]
:
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
1.operator[]
:可以通过这个运算符获取字符串中指定位置的字符,并返回该字符的引用。如果字符串是常量限定的且位置等于字符串长度,会返回指向空字符的引用。参数是位置值,第一个字符位置为 0,返回值根据字符串是否为常量限定分别为const char&
或char&
。
2.at()
:与operator[]
类似,但会进行边界检查。如果访问的位置超出范围,会抛出std::out_of_range
异常。
这些方法允许对字符串中的单个字符进行访问和(在非常量情况下)修改。但在处理多字节字符集或可变长度字符集(如 UTF-8)时,需要注意这些函数是以字节为单位进行操作,而不一定对应实际的编码字符。
(访问)at:
char& at (size_t pos); const char& at (size_t pos) const;
at
函数用于获取字符串中指定位置的字符,并返回该字符的引用。
这个函数会自动检查给定的位置pos
是否是字符串中一个有效字符的位置(即pos
是否小于字符串长度),如果不是,则会抛出std::out_of_range
异常。
参数pos
表示字符串中字符的位置,第一个字符位置用 0 表示,参数类型为size_t
,与std::string
的成员类型size_type
相同。
如果pos
不是一个有效字符的位置,会抛出越界异常!!!
如果字符串对象是常量限定的,函数返回const char&
;否则,返回char&
。
(访问末尾值引用)back:
char& back(); const char& back() const;
back
函数用于返回字符串中最后一个字符的引用。但这个函数不能在空字符串上调用。
该函数无参数。如果字符串对象是常量限定的,函数返回const char&
;否则,返回char&
。
(访问首部值引用) front:
char& front(); const char& front() const;
front
函数用于返回字符串中第一个字符的引用。与string::begin
不同,它直接返回对第一个字符的引用,而不是一个迭代器。这个函数不能在空字符串上调用。该函数无参数。如果字符串对象是常量限定的,函数返回const char&
;否则,返回char&
。
Modifiers(修改器):
(常用+=)operator+=:
string (1) string& operator+= (const string& str);c-string (2) string& operator+= (const char* s);character (3) string& operator+= (char c);
这个函数用于向字符串末尾追加内容,有以下几种重载形式:
string& operator+=(const string& str)
:将一个字符串对象的值复制并追加到当前字符串的末尾。string& operator+=(const char* s)
:将一个以空字符结尾的字符序列(C 风格字符串)复制并追加到当前字符串的末尾。string& operator+=(char c)
:将一个字符追加到当前字符串的末尾。
该函数通过在当前字符串值的末尾追加额外的字符来扩展字符串,类似于成员函数append
,但提供了不同的语法方式。参数分别为要追加的字符串对象、C 风格字符串指针和单个字符。
(追加,部分截取)append:
append
函数用于在字符串末尾追加内容,有多种重载形式:
string& append (const string& str)
:将另一个字符串对象str
的值复制并追加到当前字符串末尾。string& append (const string& str, size_t subpos, size_t sublen)
:个人理解简记:参数1:string st;参数2:x,从sr的x下标开始;参数3:size,复制的大小size。(x必须为size_类型>=0,size可比字符串大)从字符串str
中截取一部分子串进行追加。子串从位置subpos
开始,长度为sublen
个字符,如果str
长度不足或sublen
为string::npos
,则尽可能多地复制到末尾。如果subpos
大于str
的长度,会抛出out_of_range
异常。string& append (const char* s)
:将一个以空字符结尾的 C 风格字符串s
复制并追加到当前字符串末尾。string& append (const char* s, size_t n)
:将指针s
所指向的字符数组中的前n
个字符复制并追加到当前字符串末尾。string& append (size_t n, char c)
:将字符c
重复n
次后追加到当前字符串末尾。template <class InputIterator> string& append (InputIterator first, InputIterator last)
:将一个范围[first, last)
内的字符序列复制并追加到当前字符串末尾,要求输入迭代器指向的元素类型可转换为char
。如果输入迭代器是整数类型,会进行类型转换以使用形式 5。- 还可以接受初始化列表对象,将其中的每个字符复制并追加到当前字符串末尾。
参数包括要追加的字符串对象、子串的起始位置和长度、C 风格字符串指针、要复制的字符数量、单个字符、输入迭代器对以及初始化列表对象等。
(末尾追加一个字符)push_back:
void push_back (char c);
push_back
函数用于在字符串末尾添加一个字符。参数是要添加到字符串末尾的字符c
。该函数无返回值,只是将给定的字符添加到字符串中,使字符串的长度增加一。
((可部分)替换赋值)assign:
assign
函数用于为字符串赋予新的值,替换其当前内容。它有多种重载形式:
string& assign (const string& str)
:将另一个字符串对象str
的值复制给当前字符串。string& assign (const string& str, size_t subpos, size_t sublen)
:从字符串str
中截取一部分子串赋值给当前字符串。子串从位置subpos
开始,长度为sublen
个字符,如果str
长度不足或sublen
为string::npos
,则尽可能多地复制。个人简记:原str的字符串会被替换成新的str,原str的字符会清空;string& assign (const char* s)
:将一个以空字符结尾的 C 风格字符串s
复制给当前字符串。string& assign (const char* s, size_t n)
:将指针s
所指向的字符数组中的前n
个字符复制给当前字符串。string& assign (size_t n, char c)
:用字符c
重复n
次后赋值给当前字符串。template <class InputIterator> string& assign (InputIterator first, InputIterator last)
:将一个范围[first, last)
内的字符序列复制给当前字符串。- 接受初始化列表对象,将其中的每个字符按顺序复制给当前字符串。
- 移动赋值形式,获取另一个字符串对象
str
的内容,str
被置于未指定但有效的状态。
(串中_插入)insert:
insert
函数用于在字符串中插入额外的字符,有多种重载形式:
string& insert (size_t pos, const string& str)
:在指定位置pos
前插入另一个字符串对象str
的副本。string& insert (size_t pos, const string& str, size_t subpos, size_t sublen)
:从字符串str
中截取一部分子串在指定位置pos
前插入。子串从位置subpos
开始,长度为sublen
个字符,如果str
长度不足或sublen
为string::npos
,则尽可能多地复制。string& insert (size_t pos, const char* s)
:在指定位置pos
前插入一个以空字符结尾的 C 风格字符串s
的副本。string& insert (size_t pos, const char* s, size_t n)
:在指定位置pos
前插入指针s
所指向的字符数组中的前n
个字符的副本。string& insert (size_t pos, size_t n, char c)
:在指定位置pos
前插入字符c
重复n
次的副本。iterator insert (iterator p, char c)
:在迭代器p
所指位置前插入字符c
。template <class InputIterator> void insert (iterator p, InputIterator first, InputIterator last)
:在迭代器p
所指位置前插入一个范围[first, last)
内的字符序列的副本。- 接受初始化列表对象,在指定位置前插入其中的每个字符的副本。
如果大于字符串长度会抛出out_of_range
异常,第一个字符位置用 0 表示
返回值:返回一个引用到字符串的签名,返回*this
;返回迭代器的签名,返回一个指向插入的第一个字符的迭代器。成员类型iterator
是一个随机访问迭代器类型,指向字符串的字符。
(删_部分)erase:
erase
函数用于从字符串中删除部分字符,减少其长度,有以下几种重载形式:
string& erase (size_t pos = 0, size_t len = npos)
:从字符串中删除从位置pos
开始、长度为len
个字符的部分(如果字符串长度不足或len
为string::npos
,则尽可能多地删除。默认参数下会删除字符串中的所有字符,类似于成员函数clear
)。iterator erase (iterator p)
:删除迭代器p
所指向的字符。iterator erase (iterator first, iterator last)
:删除一个范围[first, last)
内的字符序列。
参数包括:对于第一种重载形式,pos
表示要删除的第一个字符的位置(如果大于字符串长度会抛出out_of_range
异常,第一个字符位置用 0 表示),len
表示要删除的字符数量;对于第二种重载形式,参数为要删除的字符的迭代器;对于第三种重载形式,参数为要删除的字符范围的起始和结束迭代器。
((部分(可迭代器))替换赋值 )replace:
replace
函数用于替换字符串中的一部分内容,有多种重载形式:
string& replace (size_t pos, size_t len, const string& str)
或string& replace (iterator i1, iterator i2, const string& str)
:用另一个字符串对象str
的值替换从位置pos
开始、长度为len
个字符的部分,或者替换迭代器i1
和i2
之间的部分。string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen)
:从另一个字符串对象str
中截取一部分子串,从位置pos
开始、长度为len
个字符的部分进行替换。子串从位置subpos
开始,长度为sublen
个字符,如果str
长度不足或sublen
为string::npos
,则尽可能多地复制。string& replace (size_t pos, size_t len, const char* s)
或string& replace (iterator i1, iterator i2, const char* s)
:用一个以空字符结尾的 C 风格字符串s
的值替换从位置pos
开始、长度为len
个字符的部分,或者替换迭代器i1
和i2
之间的部分。string& replace (size_t pos, size_t len, const char* s, size_t n)
或string& replace (iterator i1, iterator i2, const char* s, size_t n)
:用指针s
所指向的字符数组中的前n
个字符替换从位置pos
开始、长度为len
个字符的部分,或者替换迭代器i1
和i2
之间的部分。string& replace (size_t pos, size_t len, size_t n, char c)
或string& replace (iterator i1, iterator i2, size_t n, char c)
:用字符c
重复n
次后替换从位置pos
开始、长度为len
个字符的部分,或者替换迭代器i1
和i2
之间的部分。template <class InputIterator> string& replace (iterator i1, iterator i2, InputIterator first, InputIterator last)
:用一个范围[first, last)
内的字符序列替换迭代器i1
和i2
之间的部分。- 接受初始化列表对象,用其中的每个字符按顺序替换相应部分。
参数包括要替换的字符串对象、起始位置pos
(如果大于字符串长度会抛出out_of_range
异常,第一个字符位置用 0 表示)、要替换的字符数量len
、子串的起始位置和长度、C 风格字符串指针、要复制的字符数量、单个字符、输入迭代器对等。
(交换)swap:
void swap (string& str);//无法与char* c交换;只能string 类;
swap
函数用于交换两个字符串对象的内容。它接受另一个字符串对象str
作为参数,调用这个成员函数后,当前对象的值变为调用前str
的值,而str
的值变为调用前当前对象的值。注意,存在一个同名的非成员函数swap
,它重载了算法,具有类似这个成员函数的优化行为。该函数无返回值。
(末尾删除,长度-1)pop_back:
void pop_back();pop_back函数用于删除字符串的最后一个字符,从而有效地将字符串的长度减少一。该函数无参数,也无返回值。
String operations(字符串操作):
(返回字符串)str.c_str():
c_str
函数返回一个指向以空字符结尾的字符数组(即 C 风格字符串)的指针,该数组表示当前字符串对象的值。这个数组包含构成字符串对象值的相同字符序列,并且在末尾有一个额外的终止空字符('\0')。但程序不应该修改这个序列中的任何字符。返回的指针可能会因对该对象进一步调用其他修改成员函数而失效。该函数无参数,返回值是指向字符串对象值的 C 风格字符串表示的指针。
(不懂)str.data():
看不懂,先不写这个。懂了再说。
(不懂)get_allocator:
也不懂;
(拷贝覆盖)copy:
size_t copy (char* s, size_t len, size_t pos = 0) const;
功能:将字符串对象的子字符串复制到指定的字符数组中。
参数:
s
:指向字符数组的指针,该数组应包含足够的存储空间用于复制的字符。len
:要复制的字符数量,如果字符串较短,则尽可能多地复制字符。pos
:要复制的第一个字符的位置,若此值大于字符串长度,会抛出越界异常。注意,字符串中的第一个字符用 0 表示,而非 1。
返回值:复制到由s
指向的数组中的字符数量,可能等于len
或length()-pos
(如果字符串值比pos + len
短)。size_t
是一种无符号整数类型,与std::string
的成员类型size_type
相同。