string 类是模板类:
typedef basic_string<char> string;
字符串类模板 (basic string)
标准库字符串功能的基础是 basic string,该类模板提供了许多成员和函数, 与标准容器 类似。该类模板的声明如下:
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch>>
class std::basic_string
{
public:
…
}
在上述模板声明中,第一个参数(class Ch
)是说明单个字符(Ch
)所属型别(class
);第二个参数 (class Tr = char traits < Ch >
) 是特性类别, 用以提供字符串类别中的所有字符 核心操作。 该特性类别规定了 “复制字符” 或 “比较字符” 的做法; 如果不指定该特性类别,系统会根据现有的字符型别采用默认的特性类别。 第三个参数带有默认值(class A = allocator < Ch >
), 用以定义字符串类别所采用的内存模式, 通常设定为 “默认内存模型 al- locator”。 该模板及其相关功能都定义在名称空间 std
中, 由头文件 < string >
给出。
string 类的所有成员函数
函 数 名 称 | 效 果 |
---|---|
构造函数 | 产生或复制字符串 |
析构函数 | 销毁字符串 |
= , assign | 赋以新值 |
Swap | 交换两个字符串的内容 |
+ = , append(), push_back() | 添加字符 |
insert() | 插入字符 |
erase() | 删除字符 |
clear() | 移除全部字符 |
resize() | 改变字符数量 |
replace() | 替换字符 |
+ | 串联字符串 |
== ,!= ,<,<=,>,>=,compare() | 比较字符串内容 |
size(), length() | 返回字符数量 |
max_size() | 返回字符的最大可能个数 |
empty() | 判断字符串是否为空 |
capacity() | 返回重新分配之前的字符容量 |
reserve() | 保留内存以存储一定数量的字符 |
[], at() | 存取单一字符 |
>> , getline() | 从 stream 中读取某值 |
<< | 将值写入 stream |
copy() | 将内容复制为一个 C - string |
c_str() | 将内容以 C - string 形式返回 |
data() | 将内容以字符数组形式返回 |
substr() | 返回子字符串 |
find() | 搜寻某子字符串或字符 |
begin(), end() | 提供正向迭代器支持 |
rbegin(), rend() | 提供逆向迭代器支持 |
get_allocator() | 返回配置器 |
生成字符串 str 的复制品
函数说明
string s(str) //str是string类型量
函数示例
string str="hello world";
string s(str);
cout<<s;
输出:
hello world
将字符串 str 中始于 stridx 的部分作为构造函数的初值
函数说明
string s(str, stridx) // str是string类型量,stridx是起始位置下标
函数示例
string str="hello world";
string s(str, 6);
cout<<s;
输出:
world
将字符串 str 中始于 strbegin、长度为 strlen 的部分作为字符串初值
函数说明
string s(str, strbegin, strlen) //str是字符串,strbegin是起始位置下标,strlen是字符串长度
函数示例
char *str = "hello world";
string s(str, 2, 3);
cout << s;
输出:
llo
以 C_string 类型 cstr 作为字符串 s 的初值
函数说明
string s(cstr) //cstr是字符数组或字符串常量
函数示例
char *str = "hello world";
string s(str);
cout << s;
输出:
hello world
以 C_string 类型 cstr 的前 char_len 个字符串作为字符串 s 的初值
string s (cstr, char_len) //cstr是字符数组或字符串常量,char_len是长度
char str[] = "hello world";
string s(str, 6);
cout << s;
输出
hello
生成一个字符串, 包含 num 个 c 字符
string s (num, c) //num是int型变量,c是字符
string s(3, '6');
cout << s
输出:
666
以区间 [beg, end] 内的字符作为字符串 s 的初值
string s ( beg, end) //beg,end均为迭代器
string str = "hello world";
string::iterator i=str.begin();
string s(i,i+3);
cout << s;
输出:
hel
生成空字符串
string s;
若不提供分配器,则从默认构造的实例获得分配器。
当构造的string
太长而无法表达时会抛出length_error
异常
string s2 = "hello";
string 支持流读取运算符
string类重载运算符operator>>
用于输入;
cin>>s; 读入s,遇到空格或回车停止,无论原先s是什么内容都会被新读入的数据替代
string s;
getline(cin ,s);
string 支持getline函数
函数getline(istream &in,string &s)
;用于从输入流in中读取字符串到s中,以换行符’\n’分开。
string stringObject;
cin >> stringObject;
重载运算符operator<<用于输出操作。
cout << s;
string &operator=(const string &s);
把字符串s赋给当前字符串
string s = "hello"
string s1;
s1 = s;
函数示例
用 assign 成员函数复制
string s1("cat"), s3;
s3.assign(s1);
用 assign 成员函数部分复制
string s1("catpig"), s3;
s3.assign(s1, 1, 3);
从s1 中下标为1的字符开始复制3个字符给s3
函数说明
用c类型字符串s赋值
string &assign(const char *s);
用c字符串s开始的n个字符赋值
string &assign(const char *s,int n);
把字符串s赋给当前字符串
string &assign(const string &s);
用n个字符c赋值给当前字符串
string &assign(int n,char c);
把字符串s中从start开始的n个字符赋给当前字符串
string &assign(const string &s,int start,int n);
把first和last迭代器之间的部分赋给字符串
string &assign(const_iterator first,const_itertor last);
重载说明
string &operator+=(const string &s);
把字符串s连接到当前字符串的结尾
运用举例:
string s1("good "), s2("morning! ");
s1 += s2;
cout << s1;
输出:
good morning!
函数示例
string s1("good "), s2("morning! ");
s1.append(s2);
cout << s1;
s2.append(s1, 3, s1.size()); //s1.size(),s1字符数
cout << s2;
下标为3开始,s1.size()个字符,如果字符串内没有足够字符,则复制到字符串最后一个字符
函数说明
string &append(const char *s);
string &append(const char *s,int n);
string &append(const string &s);
string &append(const string &s,int pos,int n);
string &append(int n,char c);
string &append(const_iterator first,const_iterator last);
操作符说明
下标操作符
[]
在使用时不检查索引的有效性。如果下标超出字符的长度范围,会导致未定义行为;对于常量字符串,使用下标操作符时,字符串的最后字符 (即'\0'
) 是有效的。 对应 string 类型对象 (常量型) 最后一个字符的下标是有效的,调用返回字符'\0'
。
操作符示例
string s1("Hello");
s1[3] = 'a';
函数说明
函数
at()
在使用时会检查下标是否有效。 如果给定的下标超出字符的长度范围, 系统 会抛出out of range
异常。
函数示例
string s1("Hello");
for(int i=0;i<s1.length();i++)
cout << s1.at(i) << endl;
逐个访问string对象中的字符
size()和 length()
int size()const;
int length()const;
size()和 length()。 这两个函数会返回 string 类型对象中的字符个数,且它们的执行效果相同。
max_size()
int max_size()const;
max_size()函数返回 string 类型对象最多包含的字符数。 一旦程序使用长度超过
max_size()
的 string 操作, 编译器会抛出length_error
异常。
capacity()
int capacity()const;
该函数返回在重新分配内存之前, string 类型对象所能包含的最大字符数。
reserve()
调用该函数可以为 string 类型对象重新分配 内存。 重新分配的大小由其参数决定。 reserve() 的默认参数为 0。
empty()
bool empty()const;
当前字符串是否为空
resize
void resize(int len,char c);
把字符串当前大小置为len,并用字符c填充不足的部分
>
、 <
、 ==
、 >=
、<=
、 !=
等比较运算符比较两个字符串是否相等
bool operator==(const string &s1,const string &s2)const;
运算符">","<",">=","<=","!="均被重载用于字符串的比较;
compare函数在>时返回1,<时返回-1,==时返回0
比较当前字符串和s的大小
int compare(const string &s) const;
比较当前字符串从pos开始的n个字符组成的字符串与s的大小
int compare(int pos, int n,const string &s)const;
比较当前字符串从pos开始的n个字符组成的字符串与s中pos2开始的n2个字符组成的字符串的大小
int compare(int pos, int n,const string &s,int pos2,int n2)const;
与字符数组的比较
int compare(const char *s) const;
int compare(int pos, int n,const char *s) const;
int compare(int pos, int n,const char *s, int pos2) const;
find()
从pos开始查找字符c在当前字符串的位置
int find(char c, int pos = 0) const;
从pos开始查找字符串s在当前串中的位置
int find(const char *s, int pos = 0) const;
从pos开始查找字符串s中前n个字符在当前串中的位置
int find(const char *s, int pos, int n) const;
从pos开始查找字符串s在当前串中的位置
int find(const string &s, int pos = 0) const;
rfind()
返回最后一个与str中的某个字符匹配的字符,从index开始查找。如果没找到就返回string::npos
size_type rfind( const basic_string &str, size_type index );
size_type rfind( const char *str, size_type index );
返回最后一个与str中的某个字符匹配的字符,从index开始查找,最多查找num个字符。如果没找到就返回string::npos
size_type rfind( const char *str, size_type index, size_type num );
返回最后一个与ch匹配的字符,从index开始查找。如果没找到就返回string::npos
size_type rfind( char ch, size_type index );
find_first_of ()
查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::npos
size_type find_first_of( const basic_string &str, size_type index = 0 );
size_type find_first_of( const char *str, size_type index = 0 );
查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,最多搜索num个字符。如果没找到就返回string::npos
size_type find_first_of( const char *str, size_type index, size_type num );
查找在字符串中第一个与ch匹配的字符,返回它的位置。搜索从index开始
size_type find_first_of( char ch, size_type index = 0 );
find_last_of ()
在字符串中查找最后一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_last_of( const basic_string &str, size_type index = npos );
size_type find_last_of( const char *str, size_type index = npos );
在字符串中查找最后一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,最多搜索num个字符。如果没找到就返回string::nops
size_type find_last_of( const char *str, size_type index, size_type num );
在字符串中查找最后一个与ch匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_last_of( char ch, size_type index = npos );
find_first_not_of ()
在字符串中查找第一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_first_not_of( const basic_string &str, size_type index = 0 );
size_type find_first_not_of( const char *str, size_type index = 0 );
在字符串中查找第一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始,最多查找num个字符。如果没找到就返回string::nops
size_type find_first_not_of( const char *str, size_type index, size_type num );
在字符串中查找第一个与ch不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_first_not_of( char ch, size_type index = 0 );
find_last_not_of ()
在字符串中查找最后一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_last_not_of( const basic_string &str, size_type index = npos );
size_type find_last_not_of( const char *str, size_type index = npos);
在字符串中查找最后一个与str中的字符都不匹配的字符,返回它的位置。搜索从index开始,最多查找num个字符如果没找到就返回string::nops
size_type find_last_not_of( const char *str, size_type index, size_type num );
在字符串中查找最后一个与ch不匹配的字符,返回它的位置。搜索从index开始。如果没找到就返回string::nops
size_type find_last_not_of( char ch, size_type index = npos );
string s1("hello worlld");
cout << s1.find("ll") << endl;
cout << s1.find("abc") << endl;
cout << s1.rfind("ll") << endl;
cout << s1.rfind("abc") << endl;
cout << s1.find_first_of("abcde") << endl;
cout << s1.find_first_of("abc") << endl;
cout << s1.find_last_of("abcde") << endl;
cout << s1.find_last_of("abc") << endl;
cout << s1.find_first_not_of("abcde") << endl;
cout << s1.find_first_not_of("hello world") << endl;
cout << s1.find_last_not_of("abcde") << endl;
cout << s1.find_last_not_of("hello world") << endl;
输出:
2
4294967295
9
4294967295
1
4294967295
11
4294967295
0
4294967295
10
4294967295
replace()函数说明
用str中的num个字符替换本字符串中的字符,从index开始
basic_string &replace( size_type index, size_type num, const basic_string &str );
用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,最多num1个字符
basic_string &replace( size_type index1, size_type num1, const basic_string &str, size_type index2,size_type num2 );
用str中的num个字符(从index开始)替换本字符串中的字符
basic_string &replace( size_type index, size_type num, const char *str );
用str中的num2个字符(从index2开始)替换本字符串中的字符,从index1开始,num1个字符
basic_string &replace( size_type index, size_type num1, const char *str, size_type num2 );
用num2个ch字符替换本字符串中的字符,从index开始
basic_string &replace( size_type index, size_type num1, size_type num2, char ch );
用str中的字符替换本字符串中的字符,迭代器start和end指示范围
basic_string &replace( iterator start, iterator end, const basic_string &str );
basic_string &replace( iterator start, iterator end, const char *str );
用str中的num个字符替换本字符串中的内容,迭代器start和end指示范围
basic_string &replace( iterator start, iterator end, const char *str, size_type num );
用num个ch字符替换本字符串中的内容,迭代器start和end指示范围
basic_string &replace( iterator start, iterator end, size_type num, char ch );
函数示例
string s1("hello world");
s1.replace(2,3, "haha");
cout << s1;
//将s1中下标2 开始的3个字符换成“haha”
输出:
hehaha world
insert()函数说明
在迭代器i表示的位置前面插入一个字符ch
iterator insert( iterator i, const char &ch );
在字符串的位置index插入字符串str
basic_string &insert( size_type index, const basic_string &str );
basic_string &insert( size_type index, const char *str );
在字符串的位置index插入字符串str的子串(从index2开始,长num个字符)
basic_string &insert( size_type index1, const basic_string &str, size_type index2, size_type num );
在字符串的位置index插入字符串str的num个字符
basic_string &insert( size_type index, const char *str, size_type num );
在字符串的位置index插入num个字符ch的拷贝
basic_string &insert( size_type index, size_type num, char ch );
在迭代器i表示的位置前面插入num个字符ch的拷贝
void insert( iterator i, size_type num, const char &ch );
在迭代器i表示的位置前面插入一段字符,从start开始,以end结束
void insert( iterator i, iterator start, iterator end );
函数示例
string s1("hello world");
string s2("show insert");
s1.insert(5, s2) // 将s2插入s1下标5的位置
cout
<< s1 << endl;
s1.insert(2, s2, 5, 3);
//将s2中下标5开始的3个字符插入s1下标2的位置
cout << s1 << endl;
输出:
helloshow insert world
heinslloshow insert world
erase()函数说明
删除pos指向的字符, 返回指向下一个字符的迭代器
iterator erase( iterator pos );
删除从start到end的所有字符, 返回一个迭代器,指向被删除的最后一个字符的下一个位置
iterator erase( iterator start, iterator end );
删除从index索引开始的num个字符, 返回*this
basic_string &erase( size_type index = 0, size_type num = npos );
函数示例
string s1("hello worlld");
s1.erase(5);
cout << s1;
cout << s1.length();
cout << s1.size();
// 去掉下标 5 及之后的字符
输出:
hello55
substr函数
string substr(int pos = 0,int n = npos) const;
返回pos开始的n个字符组成的字符串
函数示例
string s1("hello world"), s2;
s2 = s1.substr(4,5); // 下标4开始5个字符
cout << s2 << endl;
输出:
o wor
swap函数
void swap(string &s2);
交换当前字符串与s2的值
函数示例
string s1("hello world"), s2("really");
s1.swap(s2);
cout << s1 << endl;
cout << s2 << endl;
输出:
really
hello world
string类提供了向前和向后遍历的迭代器
iterator
,迭代器提供了访问各个字符的语法,类似于指针操作,迭代器不检查范围。
用string::iterator
或string::const_iterator
声明迭代器变量,const_iterator
不允许改变迭代的内容。
begin()
onst_iterator begin()const;
iterator begin(); //返回string的起始位置
end()
const_iterator end()const;
iterator end(); //返回string的最后一个字符后面的位置
(反向迭代器自增后指向前一个值)
rbegin()
const_iterator rbegin()const;
iterator rbegin(); //返回string的最后一个字符的位置
rend()
const_iterator rend()const;
iterator rend(); //返回string第一个字符位置的前面
除了标准流和文件流输入输出外,还可以从string进行 输入输出;
类似 istream和osteram进行标准流输入输出,我们用 istringstream 和 ostringstream进行字符串上的输入 输出,也称为内存输入输出。
头文件:#include
string input("Input test 123 4.7 A");
istringstream inputString(input);
string string1, string2;
int i;
double d;
char c;
inputString >> string1 >> string2 >> i >> d >> c;
cout << string1 << endl << string2 << endl;
cout << i << endl << d << endl << c <<endl;
long L;
if(inputString >> L) cout << "long\n";
else cout << "empty\n";
输出: Input test 123
4.7 A empty
ostringstream outputString;
int a = 10;
outputString << "This " << a << "ok" << endl;
cout << outputString.str();
输出:
This 10ok
函数说明
const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本字符串相同.
函数示例
string s1("hello world");
printf("%s\n", s1.c_str());
输出:
hello world
函数说明
const char *data();
data()函数返回指向自己的第一个字符的指针.
函数示例
string s1("hello world");
const char *p1 = s1.data();
for (int i = 0; i < s1.length(); i++)
printf("%c", *(p1 + i));
//s1.data() 返回一个char * 类型的字符串,对s1 的修改可能会使p1出错
输出:
hello world
函数说明
size_type copy( char *str, size_type num, size_type index );
copy()函数拷贝自己的num个字符到str中(从索引index开始)。返回值是拷贝的字符数
函数示例
string s1("hello world");
int len = s1.length();
char *p2 = new char[len + 1];
s1.copy(p2, 5, 0);
p2[5] = 0;
cout << p2 << endl;
// s1.copy(p2,5,0) 从s1的下标0的字符开始制作一个最长5个字符长度的字符串副本并将其赋值给p2。返回值表明实际复制字符串的长度。
输出:
hello
【知识索引】【C++入门】