C++primer第三章:字符串、向量和数组

本文详细介绍了C++标准库中的关键概念,包括命名空间using声明、标准库类型string和vector的使用方法及初始化方式。此外,还深入探讨了迭代器的概念与应用,并对数组及其相关操作进行了全面解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、命名空间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 << ' ';
		}
	}
}*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值