秦悦明的运维笔记

c++ 标准库string和vector (c++ primer4th 读书笔记)

1. string

字符串。相比c语言里面的char[]可是好用多了。

2. string的4种初始化

  1. string s1;
  2. string s2(s1);
  3. string s3(“value”);
  4. string s4(n, ‘c’);

3. string的操作

操作 解释
s.empty() 是否为空串,返回true或者false if (st.emtyp()) ..
s.size() 字符串长度,相当于java里面的length()
s[n] 数组一样的用法
s1 + s2 连成一个新的字符串,返回
s1 = s2 s1的内容替换成s2的副本
v1 == v2 比较内容是否相等
> < != 比较每个字符,比较字符串会像c语言里面的调用strcmp?不存在的。

4. string::size_type类型

size()返回的是一个string::size_type类型的值,也就是说本质是用for(int i=0; i< s.size();i++)是不精确的,因为size_type是一个unsigned型的值,int会丢失精度。

5. 遍历string

正确的姿势应该是

1
2
for(string::size_type ix = 0; ix != str.size() ;++ix)
str[ix] = '*';

6. vector类型

可变数组,大小可以动态变化,用起来非常方便,个人感觉跟java里面的arraylist类似,而且还是一个模版,还是一个容器,可以包含其他对象。
使用之前先:

1
2
#include <vector>
using std::vector;

7 vector的4种初始化

类型 说明
vector v1; 保存类型为T对象
vector v2(v1); v2是v1的一个副本
vector v3(n, i); v3包含n个i
vector v4(n) 初始化n个副本的T
1
vector<int> fvec(10);

创建了10个int的vector,每个是0,

1
vector<string> svec(10);

创建了10个string,同时调用默认的构造函数进行初始化,string默认的构造函数是空串。

8. vector对象的操作

操作 说明
v.empty()
v.size()
v.push_back(t) 末尾增加一个t的元素
v[n] 下标操作
v1 = v2 赋值,替换为v2的副本
v1 == v2
!= ,<, <= ,>=, >

9. vector的size

同样返回的是size_type类型: vector::size_type。不过说实话我是经常写成int。。这个习惯要改。

10.添加元素

要用push_back(),千万不能用下标操作:

1
2
3
vector<int> v;
for(vector<int>::size_type ix=0;ix != 10; ++ix)
v[ix] = ix;

这是错误的,下标操作只能获取已存在的元素,正确应该写成:

1
2
for(vector<int>::size_type ix = 0; ix != 10; ++ix)
v.push_back(ix);

11.迭代器

除了用下标以外,标准库还提供了另一种访问元素的方法:使用迭代器 iterator

12.iterator类型

每种容器都有iterator类型

1
vector<int>::iterator iter;

13. begin和end操作

分别指向第一个元素和末端元素的下一个,end()不指向任何元素,只是起到了哨兵的作用。

14.自增,解引用

1
++iter ;

向前移动一个位置,

*iter 用迭代器访问当前指向的元素.

连起来,遍历vector就可以这样写

1
2
for(vector<int>::iterator iter = ivec.begin(); iter!= ivec.end();++iter)
*iter = 0;

c++11里面有个auto类型可以简化iter的定义工作:

1
2
for(auto iter = ivec.begin();iter!= ivec.end(); ++iter)
*iter = 0;

c++也发展迅猛,都发展到c++14了,17正在发展中。
以上就是string和vector的总结,内容跟c++ primer里面的相似度很高,哈哈,相信lippman是不会怪我的~