提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、命名空间using声明
using一般不用于头文件
二、标准库类型string
范围for可以对string使用。
三、标准库类型Vector
vector的优点在于使用v.push_back()高效增长,不用设定容量。size成员函数返回string::size_type类型。
初始化:
列表初始化:
vector<string> v1{"a", "an" ,"the"} //列表初始化
值初始化:
vector<string> v2(10,-1) //10个-1
vector<string> v3(10,"hi") //10个hi
vector<string> v2(10) //只提供数量不提供具体值
vector<string> v3{10,"hi"} //花括号里的内容不全是string,此时为值初始化
vector<string> v3{10,"hi"} //同上,10个hi。值初始化
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> v;
int s;
while (cin >> s ) {
v.push_back(s);
if (s != 10)
v.push_back(s);
else
break;
}
for (int i = 0; i < v.size() && i < v.size() / 2; i++) {
int sum = v[i] + v[v.size() - i - 1];
cout << sum << endl;
}
}
四、迭代器介绍
begin()返回第一个成员的迭代器,end()返回尾元素的下一个位置的迭代器,称为尾后迭代器。string迭代器的类型为string::iterator或者string::const_iterator。const_iterator与常量指针类似,常量的迭代器返回const_iterator类型,同时cbegin与cend也返回const_iterator。
箭头运算符->等于解引用后访问成员,it->member = (*it).member。
向vector添加元素(如push_back)会使迭代器失效。
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto it = vec.begin(); it != vec.end(); ++it) {
*it = *it * 2;
cout << *it << " ";
}
cout << endl;
}
本节练习:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto it = vec.begin(); it != vec.end(); ++it) {
*it = *it * 2;
cout << *it << " ";
}
cout << endl;
}
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<unsigned> scores(11, 0);
unsigned grade;
while (cin >> grade) {
if (grade <= 100) {
auto it = scores.begin();
it += grade / 10;
++(*it);
}
}
for (auto i = scores.begin(); i <= scores.end(); i++)
cout << *i;
cout << endl;
}
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> v;
int s;
while (cin >> s) {
v.push_back(s);
if (s != 10)
v.push_back(s);
else
break;
}
auto j = v.cend();
for (auto it = v.begin(); it < j; ++it){
cout << *it + *j << endl;
--j;
}
}
五、数组
初始化时数组维度必须为常量,显示初始化时可以忽略数组维度。
int arr[10];
int ial[] = {0,1,2};
int a[5] = {0,1,2}; //此时a为{0,1,2,0,0}
字符数组被字符串字面值初始化时注意结尾处的空字符需要预留位置。
const char a4[6] = "Daniel" //错误,没有空间储存空字符
char a3[] = "C++" //自动添加空字符
数组之间无拷贝和赋值的操作。
对于数组声明的理解:主要思路与第二章相同,从右向左看。*ptrs[10]中ptrs[10]代表它是一个数组,
∗
*
∗代表存放的是指针。(*ptrs)[10]中(*ptrs)代表它是一个指针,[10]代表它指向有10个整形的数组。
int *ptrs[10] //存放10个整形指针的数组
int &refs[10] //不存在存放引用的数组,与vector相同
int (*parray) [10] = &arr; //指向一个含有10个整形的数组。
int (&arrRef)[10] = arr; //引用一个含有10个整形的数组。
int*(&array)[10] = ptrs; //一个指向10个整形指针的数组的引用。
本节练习:
#include<iostream>
using namespace std;
int main() {
constexpr size_t array_size = 10;
int ia[array_size];
for (size_t ix = 0; ix < array_size; ++ix)
ia[ix] = ix;
}
#include<iostream>
using namespace std;
int main() {
constexpr int array_size = 10;
int ia[array_size];
for (int ix = 0; ix < array_size; ++ix) {
ia[ix] = ix + 1;
cout << ia[ix];
}
}
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int>v;
for (int i = 0; i < 10; ++i) {
v.push_back(i + 1);
cout << v[i];
}
cout << endl;
}
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec1{ 0,1,2 }, vec2{ 0,1,2 };
if (sizeof(vec1) == sizeof(vec2)) {
for (int i = 0; i < vec1.size(); ++i)
if (vec1[i] == vec2[i]) {
++i;
}
else {
cout << "vec1!=vec2";
break;
}
cout << "vec1==vec2";
}
else
cout << "vec1!=vec2";
}
#include<iostream>
#include<string.h>
#include <stdlib.h>
using namespace std;
int main() {
char c1[] = { "Werner" }, c2[] = { "Werner" }, c3[15];
strcpy(c3, c1);
strcat(c3, " ");
cout << c3 << endl;
if (abs(strcmp(c1, c2)))
cout << "����char����ͬ" << endl;
else
cout << "����char������ͬ" << endl;
}
#include<iostream>
#include<vector>
#include <iterator> //begin和end函数定义在iterator文件中
using namespace std;
int main() {
int a[] = { 0, 1, 2 };
vector<int> vec(begin(a), end(a));
int b[3];
for (int i = 0; i < vec.size(); i++) {
b[i] = vec[i];
cout << vec[i] << " " << b[i] << endl;
}
}
六、多维数组
即数组的数组,阅读顺序:由内而外,先右后左。
int a[3][4] //大小为3的数组,每个元素是有4个整数的数组
int a[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
} //列表初始化,与下一行初始化的结果相同
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; //与上一种初始化的结果相同
可以用之前所说的别名进行多维数组初始化,见2.5节:
using int_array = int[4];
typedef int int_array;
本节练习
#include<iostream>
using namespace std;
int main() {
int ia[2][3] = { 0, 1, 2, 3, 4, 5 };
for (int (&i)[3] : ia) {
for (int& j : i) {
cout << j << " ";
}
}
}
/*int main() {
int ia[2][3] = { 0, 1, 2, 3, 4, 5 };
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
cout << ia[i][j] << " ";
}
}
}*/
/*int main() {
int ia[2][3] = { 0, 1, 2, 3, 4, 5 };
for (int (*i)[3] = ia; i < ia + 2; ++i) {
for (int* j = *i; j != *i + 3; ++j) {
cout << *j << ' ';
}
}
}*/