本片博客为实验楼的训练营课程深入学习《C++ Primer第五版》的实验报告和学习笔记。
原课程地址为:https://www.shiyanlou.com/courses/405#
原文出处:http://www.cnblogs.com/jacklu/p/4793049.html
程序设计思路
实验结果:
源代码:
header.h
#pragma once #include <iostream> #include <string> #include <vector> typedef struct course { int id; string name; }course; void printHelp(); void printCourseInfo(vector<course>); void printHowMany(vector<course>); void printTheLongest(vector<course>); int deleteTheLast(vector<course>&);
source.cpp
#include "header.h" using namespace std; int main() { int cmd; int i = 0; vector<course> courses; course courseTemp; string names[] = { "Linux", "C++", "HTML", "HTML5", "NodeJS", "Shell", "Python" }; for (string name : names) { courseTemp.id = i; courseTemp.name = name; courses.push_back(courseTemp); i++; } // cout << courses[0].name; while (1) { cout << '>'; cin >> cmd; switch (cmd){ case 0: printHelp(); break; case 1: printCourseInfo(courses); break; case 2: printHowMany(courses); break; case 3: printTheLongest(courses); break; case 4: deleteTheLast(courses); break; case 5: exit(0); break; default: printHelp(); break; } } } void printHelp() { cout << "<help>" << " " << '0' << endl; cout << "<courseInfo>" << ' ' << '1' << endl; cout << "<howMany>" << " " << '2' << endl; cout << "<theLongest>" << ' ' << '3' << endl; cout << "<theLast>" << " " << '4' << endl; cout << "<exit>" << " " << '5' << endl; } void printCourseInfo(vector<course> courses) { for (auto it = courses.begin(); it != courses.end(); ++it) { cout << it->id << ' ' << it->name << endl; } } void printHowMany(vector<course> courses) { int nTemp = 0; for (auto it = courses.begin(); it != courses.end(); ++it) { nTemp++; } cout << "Total:" << nTemp << endl; } void printTheLongest(vector<course> courses) { unsigned int maxLength = 0; if (courses.empty()) { cout << "Empty" << endl; return; } for (auto it = courses.begin(); it != courses.end(); it++) { if (it->name.length() > maxLength) { maxLength = it->name.length(); } } for (auto it = courses.begin(); it != courses.end(); it++) { if (it->name.length() == maxLength) { cout << it->id << ' ' << it->name << endl; } } } int deleteTheLast(vector<course> &courses) { string lastCourse; if (courses.cbegin() == courses.cend()) { cout << "Empty" << endl; return 1; } else { lastCourse = courses.at(courses.size() - 1).name; courses.pop_back(); cout << "Deleted" << lastCourse << endl; return 0; } }
以下为自己的学习笔记
第1周:C++基础入门(第1章至第3章)
第1章
main的返回值是一个状态指示器,返回0往往表示main函数成功执行完毕,返回其他值
第2章
用class与struct的唯一区别
在于class默认下成员为private,而struct默认下为public;
引用必须要初始化:
int &refval =ival;正确,refval是ival的另一个名字
int &refval;错误
第3章
3.1头文件不应包含using声明
因为include头文件的程序,可能不需要using,但是这个using声明可能会产生某种冲突;
3.2vector不是一种数据类型
而是一种类模板,而vector<int>、vector<string>才是数据类型;
3.3几种初始化vector的方式:
vector<T> v1; 保存类型为T对象,v1为空
vector<T> v2(v1);v2是v1的一个副本
vector<T> v3(n,i);v3包含n个值为i的元素
vector<T> v4(n);v4包括了n个初始化值,初始化值与T的类型相关
vector的重要特点就是可以高效的添加元素。不清楚元素确切个数,尽量使用vector。
3.4下标
vector对象的下标也是从0开始记起,下标的类型是相应的size_type类型。
注意,只能对已知存在的元素进行下标操作。
3.5迭代器
每种容器类型都有自己的迭代器,
vector<int>::iterator iter;
注意end操作返回最后一个元素的下一个位置。
迭代器可以使用解引用来访问一个元素
有了迭代器,就可以使用迭代器来编写循环:
for(vector<int>::iterator iter = ivec.begin(); iter!=ivec.end();++iter){}
这种方式的好处是,如果vector是空的,程序是安全的。
3.6使用迭代器可以快速访问某个位置的元素
vector<int>::iterator mid = vi.begin() + vi.size()/2;
这样比自增操作高效很多。
3.7任何改变 vector 长度的操作都会使已存在的迭代器失效。例 如,在调用 push_back 之后,就不能再信赖指向 vector 的迭代器的值了
vector实现时,会预先申请一段连续内存,不断push_back总会占满内存,占满后如果系统内存足够还会在原来的内存部分申请相同大小的内存,如果连续空间不足,则vector会在另一块大连续存储空间申请内存,此时迭代器会发生改变;一般PC机连续内存很大,这种情况一般不会发生,但是只要是不确定的就是不值得信赖的;vector预先申请的内存大小是capacity()
3.8字符数组的特殊性
const char a[6] = “Daniel”;错误,没有空间可以存放空字符
3.9多维数组
多维数组就是数组的数组;
int a[3][4];大小为3的数组,每个元素是含有4个整数的数组
参考资料:《C++ primer 第五版》