C++ Primer 5 CH3 字符串、向量和数组

3.1 命名空间的 using 声明

  • 使用 using 声明:使用命名空间中的成员。
  • 头文件不应包含 using 声明:头文件的内容会拷贝到引用它的文件中去,可能产生名字冲突。

3.2 标准库类型 string

  • 初始化 string 对象
    1115873-20170315154251276-373659776.png
  • 使用等号,拷贝初始化;不使用等号,直接初始化。
  • string 操作
    1115873-20170315154424354-1225090771.png
  • 读取 string
string s1,s2;
cin >> s1 >> s2; // 输入"   Hwllo World!",会忽略前后空白
cout << s1; // "Hello"
cout << s2; // "World!"
  • 读取未知数量 string 对象
string s;
while (cin >> s) {
    cout << s << endl;
}
  • 读取一整行
while (getline(cin, s)) { //直到换行
    cout << s << endl;
}
  • string.size() 返回 size_type 类型,是无符号数。
  • string 加法
    加法运算符左右两侧至少有一个是 string,另一个可以是字符串字面值。
  • 处理 string 中的字符
    1115873-20170315170029698-277987295.png

  • 在名为 cname 的头文件中,定义的名字从属于命名空间 std,定义在名为 .h 的头文件中则不然。

3.3 标准库类型 vector

3.4 迭代器介绍

  • begin 成员负责返回指向第一个元素的迭代器,end 成员负责返回指向容器尾元素的下一位置。
  • 标准容器迭代器的运算符
    1115873-20170315172255057-1031810464.png

  • 迭代器类型:iterator 或者 const_iterator
  • 如果对象是常量:beginend 返回 const_iterator;如果对象不是常量:beginend 返回 iteratorcbegincend 始终返回 const_iterator
  • 解引用迭代器:(*it).men,括号不可少;相当于 it->men
  • 任何一种可能改变 vetcor 对象容量的操作,比如 push_back,都会使迭代器失效。
  • 迭代器运算
    1115873-20170316153140354-1365210590.png

  • 两个迭代器相减,类型是 difference_type,可正可负。
  • 迭代器的二分查找
auto begin = text.begin(), end = text.end();
auto mid = text.begin() + (end - begin) / 2;
while (mid != end && *mid != sought) {
    if (sought < *mid) end = mid;
    else begin = mid + 1;
    mid = begin + (end - begin) / 2;
}

3.5 数组

  • 数组与向量区别:数组大小固定,向量大小可变。
  • 数组维度必须是一个常量表达式。
  • 字符数组初始化,可以用字符串字面值初始化,结尾处有一个空字符。
  • 数组的声明(由内到外)
int *ptrs[10]; // ptrs 是含有 10 个整型指针的数组
int (*Parry)[10] = &arr; // Patty 指向一个含有 10 个整型的数组
int (&arrRef)[10] = arr; // arrRef 引用一个含有 10 个整型的数组
int *(&array)[10] = ptrs; // array 是数组的引用,该数组含有 10 个指针
  • 数组名字等价于指向首元素的指针
string *p  = nums; // 等价于 p = &nums[0]
p++; // p 指向 nums[1]
  • 标准库函数 begin 和 end,指向数组首元素的指针,尾元素下一位置的指针。
int a[] = {0,1,2,3};
int *p = begin(a);
int *q = end(a);
while (p != q) p++;
  • 指针运算
int a[] = {0,1,2,3};
int *p = a;
int *p1 = p + 1;
int q = *(a + 1);
cout << *p << *p1 << q;
  • 对数组执行下标操作实际上是对指向数组元素的指针执行下标操作,内置的下标运算符可以处理负值。
int a[] = {0,1,2,3};
int *p = a + 2;
cout << p[-1];
  • C 风格字符串函数
    定义在库 cstring 头文件中,数组必须空字符结尾。
    1115873-20170317102407479-969860240.png

  • 允许使用以空字符为结尾的字符数组来初始化 string 或为 string 赋值,允许 string 加法运算中一个对象是以空字符为结尾的字符数组。
char ch[] = {'C','+','+','\0'};
string a = "123";
string b = a + ch;
string c{ch};
  • 使用数组初始化向量
int a[] ={1,2,3};
vector<int> ivec{begin(a), end(a)};
vector<int> ivec2{a, a + 2};

3.6 多维数组

  • 初始化每个元素
int a[2][3] = {
    {0,1,2};
    {3,4,5};
};
int b[2][3] = {0,1,2,3,4,5};
  • 初始化每行首元素
int a[2][3] = {{1},{2}}; // 不可去掉里面花括号
  • 多维数组的下标引用
    表达式的下标运算符数量等于数组维度:元素;
    表达式的下标运算符数量少于数组维度:内层数组;
int (&row)[4] = a[1]; // 将 row 绑定到 a 的第二个 4 元素数组上
  • 使用 for 处理多维数组,除了最里层的循环外,其他循环的控制变量都需要是引用。
for (auto &row : a)
    for (auto &col : row) // 正确
for (auto row : a)
        for (auto &col : row) // 错误,row 变为指针类型
  • 遍历
for (auto p = begin(a); p != end(a); p++)
    for (auto q = begin(*p); q != end(*p); q++)
        cout<<*q;

转载于:https://www.cnblogs.com/eathen/p/6564429.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值