Essential C++ 1.5-1.6节,3.1节笔记

Array/Vector/指针,难度偏大,

但若学习初期不熟悉基本用法,则难以写出有效代码。

1. 基本概念

  • Array 是一段连续内存,数组名就是指向首地址的指针。是内建数据结构,兼容 C。
  • Vector 可以理解为大小可变的数组,是一个类 class。

2. 指针的算术运算

指针可以进行自增(++), 自减(--), 加上一个整数(+, +=), 减去一个整数(-, -=)等算术运算。

在数组中使用频繁。

指针存的是内存地址,+/- 1 时,并非简单地加上或减去该整数值,而是加上该整数与指针引用的对象的大小的乘积。

这种实现方式的好处是,方便template模板编程。例如:ptr 指向数组的某个元素,ptr+1 就是下一个元素的地址(如果没有越界的话)。

int 的长度是 4,int型指针+1,内存地址+4.

double 的长度是 8,double 型指针+1,内存地址+8.

代码和执行结果如下:

#include <iostream>
using namespace std; int main(){
int num[] = {, , , };
double f[] = {, , , };
int *ptr_int = num;
double *ptr_double = f; for (int i=; i<; i++){
cout << ptr_int + i << " " << *(ptr_int + i) << ", "
<< ptr_double + i << " " << *(ptr_double + i);
cout << endl;
}
}

执行结果:

3. Array

  • 定义 Array 时,尺度必须是常量表达式,建议使用 const 变量。

    Array 尺度无需执行期计算其值,则可在编译时分配栈内存。效率高,内存碎片小。

    new/delete 分配的是堆内存。

  • a[5] == 5[a]
    [] 运算符的定义是 a[b] = *(a+b),所以,a[5] == *(a+b) == 5[a]
  • Array 不知道自己的大小。
    但可以用  sizeof(Array_name) / sizeof(Array_type)  算出来。
#include <iostream>
using namespace std; int main(){
int num[] = {, , , };
double f[] = {, , , , }; cout << sizeof(num) / sizeof(int) << endl;
cout << sizeof(f) / sizeof(double);
}

4. Vector

  • 知道自己的大小。
    Vector 大小可变,增加元素时需要判断是否需要 resize,所以,必须知道自己的大小。
  • 不能像 Array 一样一次初始化多个变量(用{}括起)。原因?

练习1.5

撰写一个程序,使之能够询问用户姓名,并读取用户所输入的内容。

请确保用户输入的名称长度大于两个字符。如果用户的确输入了有效信息,就响应一些信息。

#include <iostream>
#include <string> // String object
using namespace std; int main(){
string name;
cout << "What's your name? ";
while ((cin >> name) && (name.size() <= )){
cout << "Please input your anme(more than 2 characters: ";
}
cout << "Hello, " << name << " ... and goodby!";
return ;
}
#include <iostream>
#include <string.h> // C-Style
using namespace std; int main(){
char name[];
cout << "What's your name? ";
while ((cin >> name) && (strlen(name) <= )){
cout << "Please input your anme(more than 2 characters: ";
}
cout << "Hello, " << name << " ... and goodby!";
return ;
}

练习1.6

撰写一个程序,从标准输入装置读取一串整数,并将读入的整数依次置入 array 及 vector。

然后遍历这两种容器,求取数值总和,将总和及平均值输出至标准输出装置。

分析:

1. 读取一串整数,可选择以字符串形式接收,或一个数字。

后者容易导致数据溢出,且需要反复转换数据类型。

2. char 转 int,直接减去 ASCII 的差值(48)即可。

3. 求和时,如果 Array 长度大于输入数字的个数,则无需遍历整个 Array 求和。

4. 求平均值时,不能直接用 int 除以 int。

#include <iostream>
#include <vector>
#include <string>
using namespace std; int main(){
const int size_max = ;
int num_arr[size_max];
vector<int> num_vec(size_max); string raw_num;
int num_count = ; int sum_arr=, sum_vec=;
double avg_arr=0.0, avg_vec=0.0; cout << "Input some numbers(no more that 100)" << " ";
cin >> raw_num;
num_count = raw_num.length(); // put numbers into array/vector
for (int i=; i<num_count; i++){
num_arr[i] = raw_num[i] - ;
num_vec[i] = num_arr[i];
} // array calculate
for (int i=; i<num_count; i++){
sum_arr += num_arr[i];
}
if (num_count != ) {
avg_arr = double(sum_arr) / num_count;
} else {
avg_arr = 0.0;
}
cout << "array sum: " << sum_arr << ", "
<< "avg: " << avg_arr << endl; // vector calculate
for (int i=; i<num_count; i++){
sum_vec += num_vec[i];
}
if (num_count != ) {
avg_vec = double(sum_vec) / num_count;
} else {
avg_vec = 0.0;
}
cout << "vector sum: " << sum_vec << ", "
<< "avg: " << avg_vec << endl; return ;
}

最新文章

  1. Javascript本质第一篇:核心概念
  2. oracle笔记一
  3. iOS AudioQueue机制的延迟问题探究
  4. [游戏模版19] Win32 物理引擎 匀速运动
  5. C#知识点总结【2】
  6. grep简单常用的语法介绍
  7. 【BZOJ 1319】 Sgu261Discrete Rootsv (原根+BSGS+EXGCD)
  8. UBuntu经常使用的操作(网络资源)
  9. nodejs集成sqlite
  10. img标签在div中水平垂直居中--两种实现方式
  11. Hibernate 学习笔记 - 1
  12. LeetCode 上最难的链表算法题,没有之一!
  13. js饼状图(带百分比)功能实现,新人必懂
  14. Ubuntu18.04LTS安装Nvidia显卡
  15. 改变eclipse默认的Tomcat部署路径
  16. gitlab+jenkins多项目,多依赖,继承等上下级项目关系的自动部署
  17. PHP用户登录解析
  18. Docker 持续集成初次体验
  19. java程序后台报错java.net.SocketException: Too many open files
  20. kmp java implement--转

热门文章

  1. centos 安装http协议的git server
  2. 关于CQRS(老外经典好文)
  3. Tomcat中部署WEB项目的四种方法
  4. 终端I/O之非规范模式
  5. mkinitrd---简单介绍
  6. Linux下安装FTP
  7. Data Structure 之 最优二叉树
  8. iOS 10 的一些资料整理
  9. 《Cortex-M0权威指南》之体系结构---嵌套中断控制器(NVIC)
  10. nginx lua mysql redis设置