1. 命名空间的using声明
using声明形式:
using
namespace::
name;
头文件不应包含using声明
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. 迭代器运算
cbegin()和cend()
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 }};
初始化第1行
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:二维数组必须指定列的数量,行的数量可以不指定