.4.2. 2 string类型
String支持大多数的顺序容器的操作,在某些方面,可以将string类型视为字符容器。除了一些特殊的操作,string类型提供与vector容器相同的操作 。string类型与vector容器不同的是,它不支持以栈的操作容器 :在string类型中不能使用front、back和pop_back、pop_front操作。
string s("hello");
string::iterator iter=s.begin();
while (iter!=s.end())
{
cout<<*iter++<<endl;
}
构造string对象的其它方法:
Strings1; //s1是一个空串
Strings2(5,’a’); //s2=”aaaaa”
Strings3(s2); //s3 为s2的copy
Strings4(s3.begin(),s3.begin()+s3.size()/2); //s4=”aa”
Strings5(cp) //定义一个新的string对象,用cp所指向的( 以空字符NULL结束的) C风格字符串初始化该对象;
Strings6(cp,n); //创建一个string对象,它被初始化为cp所指向数组的前n个元素的副本。
Strings7(s2,pos2); //创建一个string对象,它被初始化为一个已存在的string对象s2中从下标pos2开始字符的副本,如果pos2>s2.size();则该操作未定义;
Strings8(s2,pos2,len2); //创建一个string对象,它被初始化为s2中从下标pos2开始的len2个字符的副本。如果pos2>s2.size(),则该操作无定义,无论len2的长度是多少,最多只能复制s2.size()-pos2个字符;
另外 一种构造函数需要一个指向字符数组元素的指针和一个标记要复制多少字符的计数器作参数,由于该构造函数有一个计数器,因此数组不必以空字符结束:
举例如下:
Char*cp=”Hiya”;
Charc_array[]=”world!!!!”;
Charno_null={‘H’,’i’};
Strings1(cp); //ok,s1=”Hiya”
Strings2(c_array,5); //ok s2=”world”
Strings3(c_array+5,4); //oks3=”!!!!”
Strings4(no_null); //错误,没有结束标记
Strings5(no_null,2) //ok s5=”Hi”
使用只有一个指针参数的构造函数定义s1,该指针指向以空字符结束的数组中的第一个字符。这个数组的所有字符,但不包括结束符null,都被复制到新创建的string对象中。
Strings6(s1,2); // s6=”ya”
Strings7(s1,0,2); // s7=”Hi”
Strings8(s1,0,8); // s8=”Hiya”
与容器共有的string操作:
Insert
Assign
Erase
s.insert(p, t) //在迭代器 p 指向的元素之前插入一个值为 t 的新元素。返回指向新插入元素的迭代器
s.insert(p, n, t) //在迭代器 p 指向的元素之前插入 n 个值为 t 的新元素。返回void
s.insert(p, b, e) //在迭代器 p 指向的元素之前插入迭代器 b 和 e 标记范围内所有的元素。返回void
s.assign(b, e) //在迭代器 b 和 e 标记范围内的元素替换 s。对于string 类型,该操作返回 s;对于容器类型,则返回void
s.assign(n, t) //用值为 t 的 n 个副本替换 s。对于 string 类型,该操作返回 s;对于容器类型,则返回 void
s.erase(p) //删除迭代器 p 指向的元素。返回一个迭代器,指向被删除元素后面的元素
s.erase(b, e) //删除迭代器 b 和 e 标记范围内所有的元素。返回一个迭代器,指向被删除元素段后面的第一个元素
string 类型特有的版本:
s.insert(pos, n, c) //在下标为 pos 的元素之前插入 n 个字符 c
s.insert(pos, s2) //在下标为 pos 的元素之前插入 string 对象 s2 的副本
s.insert(pos, s2, pos2, len) //在下标为 pos 的元素之前插入 s2 中从下标 pos2 开始的len 个字符
s.insert(pos, cp, len) //在下标为 pos 打元素之前插入 cp 所指向数组的前 len 个字符
s.insert(pos, cp) //在下标为 pos 的元素之前插入 cp 所指向的以空字符结束的字符串副本
s.assign(s2) //用 s2 的副本替换 s
s.assign(s2, pos2, len) //用 s2 中从下标pos2 开始的 len 个字符副本替换 s
s.assign(cp, len) //用 cp 所指向数组的前len 个字符副本替换 s
s.assign(cp) //用 cp 所指向的以空字符结束的字符串副本替换 s
s.erase(pos, len) //删除从下标 pos 开始的 len 个字符
只适用于 string 类型的操作:
Substr //求子串
Append //
Replace
find
s.substr(pos, n) //返回一个string 类型的字符串,它包含 s 中从下标 pos 开始的 n 个字符
s.substr(pos) //返回一个string 类型的字符串,它包含从下标 pos 开始到 s 末尾的所有字符
s.substr() //返回 s 的副本
string 类型提供了 6 个 append 重载函数版本和10 个 replace 版本.
s.append( args) //将 args 串接在 s 后面。返回 s 引用
s.replace(pos, len, args) //删除 s 中从下标 pos开始的 len 个字符,用 args 指定的字符替换之。返回 s 的引用
s.replace(b, e, args) //删除迭代器 b 和 e 标记范围内所有的字符,用 args 替换之。返回 s 的引用
s.find( args) //在 s 中查找 args 的第一次出现
string s("C++ Primer"); // initialize s to "C++ Primer"
s.append(" 3rd Ed."); // s == "C++ Primer 3rd Ed."
// equivalent to s.append(" 3rd Ed.")
s.insert(s.size(), " 3rd Ed.");
// starting at position 11, erase 3 characters and then insert "4th"
s.replace(11, 3, "4th"); // s == "C++ Primer 4th Ed."
// equivalent way to replace "3rd" by "4th"
s.erase(11, 3); // s == "C++ Primer Ed."
s.insert(11, "4th"); // s == "C++ Primer 4th Ed."