11 String

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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值