11 String
11.1 举例
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char** argv) //将各个单词的字母逆序输出
{
const string delims(" \t,.;");
string line;
while(getline(cin, line)){
string::size_type begIdx, endIdex;
begIdx = line.find_first_not_of(delims);
//返回值为size_type,而不是迭代器
while(begIdx != string::nps){
endIdx = line.first_of(delims, begIdx);
if(endIdx == string::npos){
endIdx = line.length();
}
//注意必须将size_type类型(无符号)的begIdx强制转换,否则i会被强制转换为无符号值,若begIdx为0,则i>begIdx永远成立,导致死循环。
for(int i=endIdx-1; i>=static_cast<int>(begIdx);--i){cout<<line[i];}
cout<<' ';
begIdx = line.find_first_not_of(delims, endIdx);
}
cout<<endl;
}
}
11.2 String Class详细描述
1、相关型别
namespace std{
template<class charT, class traits = char_traits<charT>,
class Allocator = allocator<charT> >
class basic_string;
//两个特化版本
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;
}
对于string::traits_type,即为basic_string<>的第二个template参数,对于string就是char_traits<char>。
对于string::value_type,即为traits_type::char_type,对于string就是char。
对于string::size_type,即为traits_type::size_type,对于string就是size_t。
2、操作函数综览
注意:如果参数是const char* chars,而不是const string& str,则没有idx参数;也就是说C-string没有对应的索引参数。
注意:参数const char* chars不能以NULL传入。
注意:只有在单参数版本中,才将char*字符'\0'当做字符串结尾特殊符号来处理,其他情况下'\0'都不视为特殊字符。
例:string s1("nico");初始化为nico;string s2("nico", 5);初始化为nico\0(5为len参数,而没有idx参数);string(3, '\0');初始化为\0\0\0
3、构造函数和析构函数
4、string和C-string
const char*可隐式转换为char*,const char*可隐式传唤为string,string不可隐式转换为char*。
注意:不要使用NULL取代char*作为参数,否则会出现奇异行为,因为NULL会被解释为数字0或“其值为0”的字符。
string的转换:
const char * string::data() const:以字符数组的形式返回字符串内容(未追加\0);
const char* string::c_str() const:C-string形式(追加\0);
size_type string::copy(char* buf, size_type buf_size, size_type idx) const:(索引idx可由可无。)将字符串(从索引idx开始)的内容复制到“调用者提供的字符数组”中(不添加\0)。
5、reserve()可以缩减实际容量。
6、元素存取
operator[ ](不检查索引是否有效)和at()(索引无效抛出out_of_range异常)。
注意:对于operator[ ]的const版本,即const string cs("nico");cs[cs.length()]为'\0';若cs不是const,cs[cs.length()]为未定义行为。而无论是否const,cs.at(cs.length())都会抛出异常。
8、insert()
insert()具有以下重载形式:
insert(size_type idx, size_type num,charT c);
insert(iterator pos, size_type num, charT c);
因此:s.insert((std::string::size_type)0, 1, 'a'); //在索引0处插入1个a,强制转换以防止模棱两可现象。
11、搜寻函数
12、npos的意义
static const size_type npos = -1;
注意:size_type为无符号整数,索引npos为最大值,但是为unsigned long还是unsigned short最大值取决于size_type类型。
因此int idx = s.find("abc"); if(idx == std::string::npos){...}是错误的,正确定义为string::size_type idx;
13、迭代器的支持
STL所有算法都可以用于string。