第三章 字符串、向量和数组
3.4 迭代器
3.4.1 使用迭代器
练习3.23
#include <iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(10, 42);
for (auto it = v1.begin(); it != v1.end(); it++)
{
*it = *it * 2;
cout << *it << '\t';
}
}
3.4.2 迭代器使用
练习3.24
#include <iostream>
#include <vector>
using namespace std;
int main() {
int num;
vector<int> v;
cout << "输入6个整数:" << endl;
for (int i = 0; i < 6; ++i) {
cin >> num;
v.push_back(num);
}
cout << "输出相邻两数之和"<<endl;
for (auto it = v.begin(); it != v.end()-1; it++)
{
*it = *it + *(it+1);
cout << *it << '\t';
}
cout << endl;
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int main() {
int num;
vector<int> v;
cout << "输入6个整数:" << endl;
for (int i = 0; i < 6; ++i) {
cin >> num;
v.push_back(num);
}
cout << "输出首尾两数之和" << endl;
auto beg = v.begin();
auto end = v.end();
auto mid = beg + (end - beg) / 2;
while (beg != mid) {
auto sum = *beg + *(end - 1);
cout << sum << endl;
++beg;
--end;
}
return 0;
}
练习3.25
在这里插入代码片
3.5 数组
3.5.1 定义和初始化内置数组
如果不确定元素的个数,请用vector。
数组的元素个数也是数组的一部分,编译时必须知道维度。
字符串字面值的结尾处还有一个空字符,这个空字符也会像其他字符一样被拷贝到数组中去。
不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值。
3.5.2 访问数组元素
使用数组下标时候,通常将其定义为size_t类型,该类型被设计的足够大,可以表示任意对象,这个类型在stddef.h库中。
3.5.3 指针和数组
int ia[] = {0,1,2,3,4,5,6,7,8,9};
auto ia2(ia);//ia2是一个整型指针,指向ia的第一个元素
decltype(ia) ia3 = {0,1,2,3,4,5,6,7,8,9};
auto返回的是一个指针,decltype是由十个整数构成的数组。
通过数组名字或者数组中首个元素的地址都能获得指向首元素的指针。
//标准函数库begin和end
int ia[] = {0,1,2,3,4,5,6,7,8,9};
int *pbeg = begin(ia);//指向ia首元素的指针
int *pend = end(ia);//指向ia尾元素的下一位置的指针
尾指针不能进行解引用和递增操作。
给指针加上一个整数,得到的新指针仍需指向同一数组的其他元素,或者指向尾元素的下一位置的指针。
两个指针相减的结果类型是一种名为ptrdiff_t的标准库类型,与size_t一样,这个类型在stddef.h库中。
如果两个指针分别指向不相关的对象,则不能比较它们。
//下标和指针
int ia[] = {0,1,2,3,4,5,6,7,8,9};
int *p = &ia[2];//p指向索引为2的元素
int j = p[1];//p[1]等价为*(p+1),即ia[3]表示的元素
int k = p[-2];
//练习3.35
//编写一段程序,利用指针将数组中的元素置为0。
int ia[] = { 0,1,2,3,4,5,6,7,8,9 };
int* pbeg = ia;
int* pend = end(ia);
while (pbeg != pend)
{
*pbeg = 0;
++pbeg;
}
for (auto i : ia)
cout << i << " ";
cout << endl;
3.5.4 C风格字符串
C风格字符串存放在字符数组中并以空字符结束(null,‘\0’),一般用指针来操作。
3.5.5 与旧代码的接口
1.可以使用字符串字面值来初始化string对象
(1)允许使用以空字符结束的字符数组来初始化string对象或者为string对象赋值。
(2)在string 对象的加法运算中允许使用以空字符结束的字符数组作为其中一个运算对象(不能两个运算对象都是);在string对象的复合赋值运算中允许使用以空字符结束的字符数组作为右侧的运算对象。
2.不可以使用string对象直接初始化指向字符的指针,为此string专门提供了一个名为c_str的成员函数。
const char *str = s.c_str();
3.6 多维数组
C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。
对于二维数组来说,常把第一个维度称为行,第二个维度称为列。
int ia[3][4];
size_t cnd = 0;
for (auto& row : ia)
{
for (auto &col : row)
{
col = cnd;
++cnd;
}
cout << endl;
}
因为要改变元素的值,所以得把控制变量row和col声明称引用类型。
要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。