string操作总结
文章目录
构造函数
default (1)
string();
copy (2)
string (const string& str);
substring (3)
string (const string& str, size_t pos, size_t len = npos);
from c-string (4)
string (const char* s);
from buffer (5)
string (const char* s, size_t n);
fill (6)
string (size_t n, char c);
range (7)
template <class InputIterator>
string (InputIterator first, InputIterator last);
initializer list (8)
string (initializer_list<char> il);
move (9)
string (string&& str) noexcept;
示例:
|
|
迭代器
容量
length和size函数
返回字符串的长度,以字节为单位.
这是符合字符串内容的实际字节数,这不一定等于其存储容量。
注意串对象处理字节,而不知道可能最终用于编码其包含的字符的编码。因此,返回的值可能与多字节或可变长度字符(如UTF-8)序列中的编码字符的实际数量不符。
string :: size和string :: length都是同义词,并返回完全相同的值
resize函数
调整string的length值.
size_t 是一个无符号整型类型(与成员类型相同) 字符串:: SIZE_TYPE)。
函数原型:
|
|
将字符串的length调整为n个字符的长度。 如果n小于当前字符串长度,则将当前值缩短为其第n个字符,删除超出第n个字符的字符。 如果n大于当前字符串长度,则通过根据需要插入许多字符来扩展当前内容,以达到大小n。如果指定了c,新元素将被初始化为c的副本,否则它们是值初始化的字符(空字符)。
capacity函数
返回当前为字符串分配的存储空间的大小,以字节为单位。
该容量不一定等于字符串长度。它可以相等或更大,当添加新字符到字符串时,允许对象优化其操作的额外空间。
请注意,该容量并不是对字符串长度的限制。当这个容量耗尽并且需要更多时,它被对象自动扩展(重新分配它的存储空间)。字符串长度的理论限制由成员max_size给出。
每当对象被修改时,字符串的容量就可以改变,即使这种修改意味着尺寸减小或容量没有用尽(这与向量容器中的容量保证相反)。
capacity存在最小值,在GCC中即使size值为1,capacity的值仍为15,且无法改变.
reserve函数
调整string的capacity值.
请求将字符串容量调整为计划的大小更改为最多n个字符的长度。 如果n大于当前字符串容量,该函数将使容器将其容量增加到n个字符(或更大)。
该请求是非绑定的,容器可以自由地优化,留下capacity大于其size的字符串。
他的功能对字符串的length没有影响,如果reserve将string的capacity缩小到低于size值,那么capacity值将自动扩展到size值大小.
max_size函数
返回字符串可达到的最大长度,这是由于已知的系统或库实现限制,字符串可以达到的最大潜在长度,但是该对象不能保证能够达到该长度:在达到该长度之前的任何时间点仍然可能无法分配存储。
|
|
返回值如下:
|
|
shrink_to_fit函数
请求字符串减小capacity至size。
该请求是非绑定的,容器可以自由地优化,会出现capacity大于其size的情况。
示例如下:
|
|
返回结果:
|
|
实现原理
使用"swap技巧"除去多余的容量
做法:
vector<Contestant>(Contestants).swap(Contestants)
表达式vector(Contestants)创建一个临时的向量,它是contestants的拷贝:这是由vector的拷贝构造函数来完成的.然而,vector的拷贝构造函数只为所拷贝的元素分配所需要的内存,所以这个临时向量没有多余的容量.然后我们把临时向量中的数据和contestant中的数据做swap操作,在这之后,contestant具有了被去除之后的容量,即原先临时变量的容量,而临时变量的容量则变成了原先contestants臃肿的容量,而临时变量的容量则变成了原先contestants臃肿的容量.到这时,临时向量被析构,从而释放了先前为contestant所占据的内存.
同样的技巧对string也适用.
string(s).swap(s);
这一技术并不保证一定能除去多余的容量.这取决于STL的实现.STL实现者如果愿意的话,可以自由地为vector和string保留多余的容量.
元素访问
注意:元素访问函数的返回值都是字符的引用,而不是迭代器
at函数
返回对字符串中位置pos处的字符的引用。
该函数自动检查pos是字符串中字符的有效位置(即pos是否小于字符串长度),如果不是,则抛出out_of_range异常。
如果字符串对象是const-qualified,则该函数返回一个const char&。否则,它返回一个char&。
示例:
|
|
back和front函数
back函数返回对字符串最后一个字符的引用。 空字符串不得调用此函数。
示例:
|
|
front函数同理.空字符串不得调用此函数
修改
operator+=
-
string (1)
string& operator+= (const string& str);
str:一个字符串对象,其值被复制到最后。
-
c-string (2)
string& operator+= (const char* s);
s:指向以null结尾的字符序列。
该序列被复制在字符串的末尾。
-
character (3)
string& operator+= (char c);
c:一个字符,附加到字符串的当前值。
-
initializer list (4)
string& operator+= (initializer_list<char> il);
il:这些对象由初始化列表声明符自动构建。
字符以相同的顺序附加到字符串中。
示例:
|
|
append函数
通过在其当前值的末尾附加附加字符来扩展字符串:
-
string (1)
string& append (const string& str);
附加一个str的副本。
-
substring (2)
string& append (const string& str, size_t subpos, size_t sublen);
附加一个str的子串的副本。子字符串是从subpos开始的长度为sublen的字符串(如果str太短或如果sublen是string :: npos,则子串到str.end)
-
c-string (3)
string& append (const char* s);
附加由s指向的以null结尾的字符序列(C-string)形成的字符串的副本。
-
buffer (4)
string& append (const char* s, size_t n);
在s指向的字符数组中附加前n个字符的副本。
-
fill (5)
string& append (size_t n, char c);
附加n个连续的字符c。
-
range (6)
template <class InputIterator> string& append (InputIterator first, InputIterator last);
以相同的顺序追加range[first,last]中的字符序列的副本。
-
initializer list(7)
string& append (initializer_list<char> il);
以相同的顺序在il附加每个字符的副本。
示例:
|
|
push_back函数
void push_back (char c);
将字符c附加到字符串的末尾,将其长度增加1。
assign函数
为字符串分配一个新值,替换其当前string所有内容。
-
string (1)
string& assign (const string& str);
-
substring (2)
string& assign (const string& str, size_t subpos, size_t sublen);
-
c-string (3)
string& assign (const char* s);
-
buffer (4)
string& assign (const char* s, size_t n);
-
fill (5)
string& assign (size_t n, char c);
-
range (6)
template <class InputIterator> string& assign (InputIterator first, InputIterator last);
-
initializer list(7)
string& assign (initializer_list<char> il);
-
move (8)
string& assign (string&& str) noexcept;
获取str的内容。 str保留在未指定但有效的状态。
举例:
|
|
insert函数
在pos(或p)指示的字符之前的字符串中插入其他字符:
-
string (1)
string& insert (size_t pos, const string& str);
-
substring (2)
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
-
c-string (3)
string& insert (size_t pos, const char* s);
-
buffer (4)
string& insert (size_t pos, const char* s, size_t n);
-
fill (5)
string& insert (size_t pos, size_t n, char c); iterator insert (const_iterator p, size_t n, char c);
-
single character (6)
iterator insert (const_iterator p, char c);
-
range (7)
template <class InputIterator> iterator insert (iterator p, InputIterator first, InputIterator last);
-
initializer list (8)
string& insert (const_iterator p, initializer_list<char> il);
举例:
|
|
erase函数
-
sequence (1)
string& erase (size_t pos = 0, size_t len = npos);
-
character (2)
iterator erase (const_iterator p);
-
range (3)
iterator erase (const_iterator first, const_iterator last);
示例:
|
|
replace函数
将以pos为开头,长度为len的子字符串替换为新内容.
-
string (1)
string& replace (size_t pos, size_t len, const string& str); string& replace (const_iterator i1, const_iterator i2, const string& str);
-
substring (2)
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
-
c-string (3)
string& replace (size_t pos, size_t len, const char* s); string& replace (const_iterator i1, const_iterator i2, const char* s);
-
buffer (4)
string& replace (size_t pos, size_t len, const char* s, size_t n); string& replace (const_iterator i1, const_iterator i2, const char* s, size_t n);
-
fill (5)
string& replace (size_t pos, size_t len, size_t n, char c); string& replace (const_iterator i1, const_iterator i2, size_t n, char c);
-
range (6)
template <class InputIterator> string& replace (const_iterator i1, const_iterator i2, InputIterator first, InputIterator last);
-
initializer list (7)
string& replace (const_iterator i1, const_iterator i2, initializer_list<char> il);
示例:
|
|
swap函数
void swap (string& str);
将该string与另一个string交换.
示例:
|
|
pop_back函数
删除字符串的最后一个字符,将其长度减少一个。
示例:
|
|
字符串操作
c_str函数
const char* c_str() const noexcept;
返回一个指向数组的指针,该数组包含一个以空字符终止的字符序列(即C字符串),表示字符串对象的当前值。该数组包括组成字符串对象的值的相同序列,并在末尾加上另外的终止空字符(’\ 0’)。
举例:
|
|
data函数
const char* data() const noexcept;
返回一个指向数组的指针,该数组包含一个以空字符终止的字符序列(即C字符串),表示字符串对象的当前值。
该数组包括组成字符串对象的值的相同序列,并在末尾加上另外的终止空字符(’\ 0’)。
返回的指针指向字符串对象当前使用的内部数组,以存储符合其值的字符。
string :: data和string :: c_str都是同义词,并返回相同的值。
示例:
|
|
get_allocator函数
allocator_type get_allocator() const noexcept;
返回与该字符串关联的allocator对象的副本。 字符串使用默认 allocator类型,它没有状态(因此,返回的值与默认构造的分配器相同)。
copy函数
将字符串对象的当前值的子字符串复制到由s指向的数组中。此子字符串包含从位置pos开始的len字符。 该函数在复制的内容的末尾没有附加一个空字符。
复制到s指向的数组的字符数。这可能等于len或length()- pos(如果字符串值比pos + len短)。
size_t copy (char* s, size_t len, size_t pos = 0) const;
s: 指向字符数组的指针。 数组应为复制的字符包含足够的存储空间。
len: 要复制的字符数(如果字符串较短,复制尽可能多的字符)。
pos: 要复制的第一个字符的位置。 如果这大于字符串长度,它将抛出out_of_range。 注意:字符串中的第一个字符由0(不是1)表示。
示例:
|
|
find函数
查找字符串中的内容
搜索由其参数指定的序列的第一次出现的字符串。
当指定pos时,搜索仅包含位置pos或之后的字符,忽略在pos之前包含字符的任何可能的事件。
请注意,与成员find_first_of不同,只要搜索多个字符,只有其中一个字符匹配是不够的,整个序列必须匹配。
返回第一场匹配的第一个字符的位置。 如果没有找到匹配,该函数返回string :: npos。
-
string (1)
size_t find (const string& str, size_t pos = 0) const noexcept;
-
c-string (2)
size_t find (const char* s, size_t pos = 0) const;
-
buffer (3)
size_t find (const char* s, size_t pos, size_type n) const;
-
character (4)
size_t find (char c, size_t pos = 0) const noexcept;
str:
搜索的字符串
pos:
搜索中要考虑的字符串中第一个字符的位置。 如果这大于字符串长度,该函数将永远不会找到匹配项。 注意:第一个字符由0(不是1)表示:值为0表示搜索整个字符串。
s:
指向字符数组的指针。 如果指定参数n,则要匹配的序列是数组s中的前n个字符。 否则要匹配的序列的长度由空字符的第一次出现确定。
n:
要匹配的字符序列长度
c:
要搜索的字符
|
|
rfind函数
查找字符串中的最后一个内容 搜索由其参数指定的序列的最后一次出现的字符串。
当指定pos时,搜索仅包括在位置pos之前或之后开始的字符序列,忽略在pos之后开始的任何可能的匹配。
返回最后一次匹配的第一个字符的位置。如果没有找到匹配,该函数返回string :: npos。
-
string (1)
size_t rfind (const string& str, size_t pos = npos) const noexcept;
-
c-string (2)
size_t rfind (const char* s, size_t pos = npos) const;
-
buffer (3)
size_t rfind (const char* s, size_t pos, size_t n) const;
-
character (4)
size_t rfind (char c, size_t pos = npos) const noexcept;
str:
搜索的字符串
pos:
字符串中最后一个字符的位置被视为匹配的开头。 任何大于或等于字符串长度的值(包括string :: npos)意味着搜索整个字符串。 注意:第一个字符由0(不是1)表示。
s:
指向字符数组的指针。 如果指定参数n,则要匹配的序列是数组中的前n个字符。 否则匹配的序列的长度由空字符的第一次出现确定。
n:
要匹配的字符序列长度
c:
要搜索的字符
示例:
|
|
find_first_of函数
查找字符串中的字符
搜索与其参数中指定的任何字符匹配的第一个字符的字符串。 当指定pos时,搜索仅包含位置pos或之后的字符,忽略pos之前的任何可能的事件。
请注意,序列的一个字符匹配(不是全部)都足够了。请参阅string :: find查找与整个序列匹配的函数。
返回匹配的第一个字符的位置。如果没有找到匹配项,该函数返回string :: npos。
-
string (1)
size_t find_first_of (const string& str, size_t pos = 0) const noexcept;
-
c-string (2)
size_t find_first_of (const char* s, size_t pos = 0) const;
-
buffer (3)
size_t find_first_of (const char* s, size_t pos, size_t n) const;
-
character (4)
size_t find_first_of (char c, size_t pos = 0) const noexcept;
示例:
|
|
find_last_of函数
从字符串中查找字符串 搜索与其参数中指定的任何字符匹配的最后一个字符的字符串。 当POS指定,搜索仅包括在字符或位置之前POS,忽略后的任何可能发生的POS。
返回匹配的最后一个字符的位置。如果没有找到匹配项,该函数返回string :: npos。
-
string (1)
size_t find_last_of (const string& str, size_t pos = npos) const noexcept;
-
c-string (2)
size_t find_last_of (const char* s, size_t pos = npos) const;
-
buffer (3)
size_t find_last_of (const char* s, size_t pos, size_t n) const;
-
character (4)
size_t find_last_of (char c, size_t pos = npos) const noexcept;
示例:
|
|
find_first_not_of函数
查找字符串中没有字符
搜索与其参数中指定的任何字符不匹配的第一个字符的字符串。
当指定pos时,搜索仅包含位置pos或之后的字符,忽略该字符之前的任何可能的事件。
-
string (1)
size_t find_first_not_of (const string& str, size_t pos = 0) const noexcept;
-
c-string (2)
size_t find_first_not_of (const char* s, size_t pos = 0) const;
-
buffer (3)
size_t find_first_not_of (const char* s, size_t pos, size_t n) const;
-
character (4)
size_t find_first_not_of (char c, size_t pos = 0) const noexcept;
示例:
|
|
find_last_not_of函数
从最后找到字符串中不匹配的字符
搜索与其参数中指定的任何字符不匹配的最后一个字符的字符串。
当POS指定,搜索仅包括在字符或位置之前POS,忽略后的任何可能发生的POS。
-
string (1)
size_t find_last_not_of (const string& str, size_t pos = npos) const noexcept;
-
c-string (2)
size_t find_last_not_of (const char* s, size_t pos = npos) const;
-
buffer (3)
size_t find_last_not_of (const char* s, size_t pos, size_t n) const;
-
character (4)
size_t find_last_not_of (char c, size_t pos = npos) const noexcept;
示例:
|
|
substr函数
string substr(size_t pos = 0,size_t len = npos)const;
生成子串
返回一个新建的 串对象的值初始化为该对象的子字符串的副本。
子字符串是从字符位置pos开始并跨越len个字符(或直到字符串的末尾,以先到者为准)的部分。
|
|
compare函数
比较字符串
将字符串对象(或子字符串)的值与其参数指定的字符序列进行比较。
返回一个整型值,表示字符串之间的关系.
-
string (1)
int compare (const string& str) const noexcept;
-
substrings (2)
int compare (size_t pos, size_t len, const string& str) const; int compare (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
-
c-string (3)
int compare (const char* s) const; int compare (size_t pos, size_t len, const char* s) const;
-
buffer (4)
int compare (size_t pos, size_t len, const char* s, size_t n) const;
示例:
|
|
重载
operator+
-
string (1)
string operator+ (const string& lhs, const string& rhs); string operator+ (string&& lhs, string&& rhs); string operator+ (string&& lhs, const string& rhs); string operator+ (const string& lhs, string&& rhs);
-
c-string (2)
string operator+ (const string& lhs, const char* rhs); string operator+ (string&& lhs, const char* rhs); string operator+ (const char* lhs, const string& rhs); string operator+ (const char* lhs, string&& rhs);
-
character (3)
string operator+ (const string& lhs, char rhs); string operator+ (string&& lhs, char rhs); string operator+ (char lhs, const string& rhs); string operator+ (char lhs, string&& rhs);
relational operators
(1)
bool operator== (const string& lhs, const string& rhs);
bool operator== (const char* lhs, const string& rhs);
bool operator== (const string& lhs, const char* rhs);
(2)
bool operator!= (const string& lhs, const string& rhs);
bool operator!= (const char* lhs, const string& rhs);
bool operator!= (const string& lhs, const char* rhs);
(3)
bool operator< (const string& lhs, const string& rhs);
bool operator< (const char* lhs, const string& rhs);
bool operator< (const string& lhs, const char* rhs);
(4)
bool operator<= (const string& lhs, const string& rhs);
bool operator<= (const char* lhs, const string& rhs);
bool operator<= (const string& lhs, const char* rhs);
(5)
bool operator> (const string& lhs, const string& rhs);
bool operator> (const char* lhs, const string& rhs);
bool operator> (const string& lhs, const char* rhs);
(6)
bool operator>= (const string& lhs, const string& rhs);
bool operator>= (const char* lhs, const string& rhs);
bool operator>= (const string& lhs, const char* rhs);
文章作者 Forz
上次更新 2017-06-23