1. 命名空间的using声明
using namespace::name;
2. 标准库类型string
1. string初始化
string s3("value")
- 如果使用等号(=)初始化一个变量,实际上执行的是拷贝初始化,编译器把等号右侧的初始值拷贝到新创建的对象中去。如果不使用等号,则执行的是直接初始化。
2. string对象操作
getline(is, s)
s[n]
读写string对象
- string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止
- string::size_type是一个无符号类型的值而且能足够存放下任何string对象的大小
比较string对象
- 如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果
字面值和string对象相加
string s4 = s1 + ", ";
string s5 = "hello" + ", ";
- 必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string
3. 处理string对象中的字符
范围的for语句
for (declaration : expression)
statement
string str("some string");
for (auto c : str)
cout << c << endl;
改变字符串中字符
- 想要改变string对象中字符的值,必须把循环变量定义成引用类型
string s("Hello World!!!");
for (auto &c : s)
c = toupper(c);
cout << s << endl;
- string对象中的单个字符有两种方式:一种是使用下标,另外一种是使用迭代器
- 在访问指定字符之前,首先检查s是否为空
3. 标准库类型vector
- 标准库类型vector表示对象的集合,其中所有对象的类型都相同
1. 初始化vector
#include <vector>
using std::vector;
vector<int> ivec;
vector<Sales_item> Sales_vec;
vector<vector<string>> file;
2. 向vector中添加元素
vector<int> v2;
for (int i = 0; i != 100; ++i)
v2.push_back(i);
- push_back负责把一个值当成vector对象的尾元素”压到(push)”vector对象的”尾端(back)
- vector支持下标操作,但不能用下标形式添加元素
4. 迭代器介绍
1. 使用迭代器
auto b = v.begin(), e = v.end();
- 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
标准容器迭代器的运算符
*iter
iter->mem
等价于(*iter).mem
- 使用迭代器把string对象的第一个字母改为了大写形式
string s("some string");
for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {
*it = toupper(*it);
}
迭代器类型
vector<int>::iterator it;
string::iterator it2;
vector<int>::const_iterator it3;
string::const_iterator it4;
2. 迭代器运算
auto it = v.cbegin(); // it的类型是vector<int>::const_iterator
两种情况使迭代器失效
- 不能在范围for循环中向vector对象添加元素
- 任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效
5. 数组
1. 定义和初始化内置数组
int arr[10];
string bad[cnt];
显式初始化数组元素
int a3[5] = {0, 1, 2}; //等价于a3[] = {0, 1, 2, 0, 0}
string a4[3] = {"hi", "bye"}; // 等价于 a4[] = {"hi", "bye", ""}
字符数组的特殊性
char a1[] = {'C', '+', '+'};
char a2[] = {'C', '+', '+', '\0'};
char a3[] = "C++";
const char a4[6] = "Daniel";
不允许拷贝和赋值
- 不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值
int a[] = {0, 1, 2};
int a2[] = a;
aa2 = a;
复杂的数组声明
int *(&arry)[10] = ptrs;
2. 访问数组元素
3. 指针和数组
string nums[] = {"one", "two", "three"};
string *p = &nums[0];
string *p2 = nums;
指针也是迭代器
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *p = arr;
++p;
int *e = &arr[10];
int ia[] = {0,1,2,3,4,5,6,7,8,9};
int *beg = begin(ia);
int *last = end(ia);
指针运算
- 给(从)一个指针加上(减去)某整数值,结果仍是指针。新指针指向的元素与原来的指针相比前进了(后退了)该整数值个位置
- 和迭代器一样,两个指针相减的结果是它们之间的距离
- 只要两个指针指向同一个数组的元素,或者指向该数组的尾元素的下一位置,就能利用关系运算符对其进行比较
解引用和指针运算的交互
int ia[] = {0,2,4,6,8}; // 含有5个整数的数组
int last = *(ia + 4); // 正确:把last初始化成8,也就是ia[4]的值
last = *ia + 4; // 正确: last = 4等价于ia[0] + 4
下标和指针
int i = ia[2];
int *p = ia;
i = *(p + 2);
int *p = &ia[2];
int j = p[1];
int k = p[-2];
6. 多维数组
多维数组的初始化
- 使用花括号括起来的一组值初始化多维数组,和普通的数组一样
- 也可去掉花括号
- 初始化每一行的第一个元素
int ia[3][4] = {{ 0 }, { 4 }, { 8 }};
int ia[3][4] = {0, 3, 6, 9 };
多维数组的下标引用
// 用arr的首元素为ia最后一行的最后一个元素赋值
ia[2][3] = arr[0][0][0];
int (&row)[4] = ia[1]; // 把row绑定到ia的第二个4元素数组上
指针与多维数组
int ia[3][4]; //大小为3的数组,每个元素是含有4个整数的数组 int (*p)[4] = ia; // p指向含有4个整数的数组
p = &ia[2]; // p指向ia的尾元素
- tips:二维数组必须指定列的数量,行的数量可以不指定