【Primer C++】第三章:字符串、容器

文章目录

    • string
      • `getline`函数
      • `string::size_type`
      • 字面值与string对象相加
      • 处理`string`对象中的字符
    • 容器
      • 标准库类型`vector`
      • 迭代器
      • 标准库函数`begin()`,`end()`
    • C风格的字符串

string

getline函数

getline函数的参数是一个输入流和一个string对象,函数从输入流中读入内容,直到遇到换行符为止(换行符也被读入),但是string对象中却不包含换行符

string::size_type

对于stringsize函数来说,返回的是一个string::size_type类型的值;

字面值与string对象相加

当把string对象和字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string

string s4 = s1 + ", ";
string s5 = "hello" + ", "; // 错误,两个运算对象都不是string
string s6 = s1 + ", " + "world";
string s7 = "hello" + ", " + s2;

处理string对象中的字符

改变某个字符的特性,在cctype头文件中定义:

isalnum(c),isalpha(c),isdigit(c)...

容器

标准库类型vector

需要注意的是,在早期版本的C++标准中,如果vector的元素还是vector(或者其他模板类型),则应该写成:

vector >而非vector>	// 注意区别为空格

vector的列表初始值还是元素数量区别,根据()或者{}判断:

vector v1(10)	// 10个元素
vector v1{10}	// 一个元素,值为0

针对于{}初始化的形式,如果提供的值不能用来列表初始化,此时就要考虑用这样的值来构造vector对象了。

vector strVec{10};	// 此时是创建了拥有10个元素的值初始化的vector
vector strVec{10, "hi"}	// 此时创建了包含有10个“hi”的vector
vector strVec(10, "hi")	// 同上

vector strVec("hi")		// 报错,为甚麽这个不能解释为含有一个“hi”的vector,理解应该是“()”中
								// 有1个元素的时候,已经明确规定是表示的大小,必须为正整数

创建vector对象时,往往是创建一个空的vector,然后通过push_back方法向里面追加元素。

迭代器

.begin().end()

标准库函数begin()end()

这两个函数包含在头文件iterator中,

获得数组的头指针和尾后指针,将数组作为参数传入:

int ia[] = {1,2,3,4,5,6}
int *beg = begin(ia);
int *last = end(ia);

C风格的字符串

C风格的字符串需要以’\0’结尾,与此相关的库函数包含在头文件string.h中,但都要求传入的字符串需要以‘\0’结尾,才能正常工作。

允许使用以空字符结尾的字符数组来初始化string对象或为string对象赋值;在string 对象的加法运算中,允许使用以空字符结束的字符数组作为其中一个运算对象(但是不能两个都是)。

很多c++程序在标准库出现之前就已经写成了,因此肯定没有用到string和vector类型,因此c++为了与旧代码进行衔接,专门提供了一组功能:混用string和c风格的字符串。

在以string作为参数的方法中可以传入c风格的字符串,反之则不可以将string传给以c风格字符串作为参数的方法。

作为补充,c++提供了将string转换为c风格字符串的方法:c_str(),返回的则是一个指向数组的指针,因此考虑如下的代码:

string s = "hello";
const char *pch = s.c_str();
s = "world";

此时pch则是指向字符串“world”的指针
若想一直使用执行完c_str()返回的数组,最好执行拷贝

你可能感兴趣的:(C,plus,plus)