知识点学习

Vector容器

  • vector是C++标准程序库中的一个类,其定义于头文件中,与其他STL组件一样,ventor属于STD名称空间;

  • ventor是C++标准程序库里最基本的容器,设计之初是为了改善C语言原生数组的种种缺失和不便,而欲提供一种更有效,安全的数组;

根据使用功能大概分为几个部分

  • 访问元素的方法

ven[i] 访问索引值为i的引用

ven.back() 返回ventor最尾元素的引用

  • 新增或移动元素的方法

vec.push_back() 新增元素至ventor的尾端,必要时会进行存储器配置;

vec.pop_back() 删除ventor最尾端的元素

vec.insert() 插入或多个元素至ventor内的任意位置

vec.erase() 删除ventor中一个或多个元素

vec.clear() 清空所有元素

  • 获取长度/容量

vec.size() 获取vector目前持有的元素个数

vec.empty() 如果vector内部为空,则传回true值

  • 迭代(iterator)

  • vec.begin() 返回一个迭代器,指向vector第一个元素

  • vec.end() 返回一个迭代器,它指向vector最尾端元素的下一个位置(不是最末元素)尾地址不指向任何存储的元素,而是标志vector的结束。

string

string是c++标准程序库中的一个头文件,定义了C++标准中的字符串的基本模板类std::basic_string及相关的模板类实例:

经常用到的功能:

  • 《字符访问》

string::at

访问特定字符,带边界检查

string:: operator[]

访问特定字符

string::front

访问第一个字符

string::back

访问最后一个字符

string::data

访问基础数组

string:: substr

以子串构造一个新串,参数为空时取全部源串

string:: clear

清空内容

string:: erase

删除一个或一段字符

string:: push_back

追加1个字符

string:: pop_back

删除最后1个字符,C++11标准导入

函数传参定义

  1. 三种传参方式比较

值传递:实参要初始化形参要分配空间,将实参内容拷贝到形参;

指针传递:本质仍是值传递;

引用传递:实参初始化形参的时候不分配空间;

  1. 函数的返回值

通过函数调用使主调函数能得到一个确定的值,这就是函数的返回值

1)函数的返回值是通过函数中的return语句获得的;

  1. return语句将被调用函数中的一个确定值带回主调函数中去。

2)函数值的类型,既然函数有返回值,这个值当然应属于某一个确定的类型,应当在定义函数时指定函数值的类型;

  1. return后面的语句可以是变量、常量、表达式、函数;

3)在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致。

  1. 如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准。对数值型数据,可以自动进行类型转换。即函数类型决定返回值的类型;

4)对于不带返回值的函数,应当“void”定义函数为“无类型”(或称“空类型”),这样系统就保证不使用函数带回任何值,即禁止调用函数中使用被调用函数的返回值。

linux GCC编译方法

  1. g++ -std=c++11 test.cpp -o test

建议完成《C++ primer 第五版》练习

练习题 4.21

使用条件运算符从ventor中找到哪些元素的值是奇数,然后将这些奇数翻倍

  1. #include "stdafx.h"
  2. #include <vector>
  3. #include <iostream>
  4. using std::cout;
  5. using std::endl;
  6. using std::vector;
  7. int main()
  8. {
  9. vector<int> ivec{1,2,3,4,5,6,7,8,9,10};
  10. //如果是奇数I乘以2,否则输出
  11. for (auto & i : ivec)
  12. {
  13. i = (i % 2) ? (i * 2) : i;
  14. }
  15. for (auto i : ivec)
  16. {
  17. cout << i << "" << endl;
  18. }
  19. return 0;
  20. }

5.5 写一段自己的程序,使用if else语句实现把数字成绩转换成字母成绩的要求

  1. int main()
  2. {
  3. vector<string> scores = { "F","D","C","B","A","A++" };
  4. int grade{ 0 };
  5. while (cin >> grade)
  6. {
  7. string lettergrade;
  8. if (grade<60)
  9. {
  10. lettergrade = scores[0];
  11. }
  12. else
  13. {
  14. lettergrade = scores[(grade - 50) / 10];
  15. if (grade != 100)
  16. {
  17. if (grade % 10 > 7) //个位数大于7,那么加上 + 号
  18. {
  19. lettergrade += "+";
  20. }
  21. else if (grade % 10 <3) //个位数小于3,那么加上 - 号
  22. {
  23. lettergrade += "-";
  24. }
  25. }
  26. }
  27. cout << lettergrade << endl;
  28. }
  29. return 0;
  30. }

练习题 5.14

编写一段程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词,如果这样的单词存在,输出重复出现的最大次数,如果不存在,输出一条信息说明任何单词都没有连续出现过。例如,如果输入时

how now now now brown cow cow

那么输出应该表明单词now连续出现了3次


  1. #include "stdafx.h"
  2. #include <string>
  3. #include <iostream>
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7. using std::string;
  8. string pre_word, word, max_repeat_word;
  9. int repeat_time = 0, max_repeat_time = 0;
  10. int main()
  11. {
  12. while (cin>>word)
  13. {
  14. if (word == pre_word)
  15. {
  16. ++repeat_time;
  17. }
  18. else
  19. {
  20. repeat_time = 1;
  21. pre_word = word;
  22. }
  23. if (max_repeat_time < repeat_time)
  24. {
  25. max_repeat_time = repeat_time;
  26. max_repeat_word = pre_word;
  27. }
  28. if (max_repeat_time > 4)
  29. {
  30. break;
  31. }
  32. }
  33. if (max_repeat_time<=1)
  34. {
  35. cout << "no word was repeated" << endl;
  36. }
  37. else
  38. {
  39. cout << "the word '" << max_repeat_word << "' occurred " << max_repeat_time << " times " << endl;
  40. }
  41. return 0;
  42. }

练习题 5.17

假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为了实现这一目标,对于两个不等长的vector对象,只需挑出长度较短的那个,把它的所有元素和另一个vector对象比较即可。例如如果两个vector对象的元素分别是0、1、1、2和0、1、1、2、3、5、8,则程序的返回结果应该为真;

  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <vector>
  4. using std::cout;
  5. using std::endl;
  6. using std::vector;
  7. int main()
  8. {
  9. vector<int> vec1{ 0,1,1,2 };
  10. vector<int> vec2{ 0,1,1,2,3,5,8 };
  11. auto size = vec1.size() < vec2.size() ? vec1.size() : vec2.size();
  12. for (decltype(vec1.size()) i = 0 ; i != size; ++i)
  13. {
  14. if (vec1[i] != vec2[i])
  15. {
  16. cout << "false" << endl;
  17. return 0;
  18. }
  19. }
  20. cout << "true" << endl;
  21. return 0;
  22. }

练习题 5.20

编写一段程序,从标准输入中读取string对象的序列直到连续出现两个相同的单词或者所有单词都读完位置。使用while循环一次读取一个单词,当一个单词连续出现两次时使用break语句终止循环。输出连续重复出现的单词,或者输出一个消息说明没有任何单词是连续重复的。

  1. #include "stdafx.h"
  2. #include <string>
  3. #include <iostream>
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7. using std::string;
  8. int main()
  9. {
  10. string read, tmp;
  11. while (cin >> read)
  12. {
  13. if (read == tmp)
  14. {
  15. break;
  16. }
  17. else
  18. {
  19. tmp = read;
  20. }
  21. }
  22. //输入流的末尾内容
  23. if (cin.eof())
  24. {
  25. cout << "no word was repeated." << endl;
  26. }
  27. else
  28. {
  29. cout << read << " occurs twice in succession." << endl;
  30. }
  31. return 0;
  32. }

第6章函数

练习题 6.4

编写一个与用户交互的函数,要求用户输入一个数字,计算生成该数字的阶乘,在main函数中调用该函数,计算阶乘结果有多少个0

  1. int jiecheng(int chengshu)
  2. {
  3. int Sum = 1;
  4. int nCount = 0;
  5. for (int i=1;i<=chengshu;i++)
  6. {
  7. Sum = i*Sum;
  8. }
  9. cout << endl;
  10. cout << "阶乘数" << Sum;
  11. for (;Sum;)
  12. {
  13. if (Sum%10==0)
  14. {
  15. nCount++;
  16. }
  17. Sum = Sum / 10;
  18. }
  19. return nCount;
  20. }
  21. int _tmain(int argc, _TCHAR* argv[])
  22. {
  23. int nNum;
  24. cin >> nNum;
  25. nNum = jiecheng(nNum);
  26. cout << endl;
  27. cout << nNum;
  28. return 0;
  29. }
练习题 6.10

编写一个函数,使用指针形参交换两个数的值,在函数中调用并输出交换后的结果;

  1. void swap(int * lhs, int * rhs)
  2. {
  3. int tmp;
  4. tmp = *lhs;
  5. *lhs = *rhs;
  6. *rhs = tmp;
  7. }
  8. int _tmain(int argc, _TCHAR* argv[])
  9. {
  10. int nNumA = 10;
  11. int nNumB = 20;
  12. swap(&nNumA, &nNumB);
  13. cout << nNumA << " " << nNumB;
  14. return 0;
  15. }
练习题 6.12

使用引用而非指针交换两个整数的值,那种方式比较易于使用呢?

  • 拷贝大的类类型对象或者容器对象比较低效,当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象;
  • 引用一经初始化不能再引用其他变量,而指针可以(非const指针)
  1. #include <iostream>
  2. #include <string>
  3. void swap(int& lhs, int& rhs)
  4. {
  5. int temp = lhs;
  6. lhs = rhs;
  7. rhs = temp;
  8. }
  9. int main()
  10. {
  11. for (int left, right;
  12. std::cout << "Please Enter:\n", std::cin >> left >> right;) {
  13. swap(left, right);
  14. std::cout << left << " " << right << std::endl;
  15. }
  16. return 0;
  17. }
练习题 6.17

编写一个函数,判断string对象中是否有大写字母,编写另外一个函数把string对象全都改成小写形式。这两个函数中你使用的形参类型相同吗?

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <iostream>
  4. #include <string>
  5. using std::cout;
  6. using std::cin;
  7. using std::endl;
  8. using std::string;
  9. bool hasUpercase(const string & str)
  10. {
  11. for (auto c :str)
  12. {
  13. if (isupper(c))
  14. {
  15. return true;
  16. }
  17. }
  18. return false;
  19. }
  20. const string & makeLowercase(string & str)
  21. {
  22. for (auto & c : str)
  23. {
  24. if (isupper(c))
  25. {
  26. c = tolower(c);
  27. }
  28. }
  29. return str;
  30. }
  31. int _tmain(int argc, _TCHAR* argv[])
  32. {
  33. string str("Hello World");
  34. cout << "类型是否是大写" << endl;
  35. cout << hasUpercase(str) << endl;
  36. cout << "转换小写函数";
  37. cout << makeLowercase(str) << endl;
  38. return 0;
  39. }
练习题 6.22

编写一个函数,令其交换两个init指针;

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. #include <iostream>
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7. void swap(int * & lft, int * & rht)
  8. {
  9. auto tmp = lft;
  10. lft = rht;
  11. rht = tmp;
  12. }
  13. int _tmain(int argc, _TCHAR* argv[])
  14. {
  15. int i = 42;
  16. int j = 99;
  17. auto lft = &i;
  18. auto rht = &j;
  19. swap(lft, rht);
  20. cout << *lft << " " << *rht << endl;
  21. return 0;
  22. }
练习题 6.36

编写一个函数声明,使其返回数组的引用并且该数组包含10个string对象,不要尾置返回类型、decltype或者类型别名;

  1. string (&func(string (&arrStr)[10]))[10]

C++学习3--编程基础(vector、string、三种传参)的更多相关文章

  1. 学习java之基础语法(三)

    学习java之基础语法(三) java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运 ...

  2. Effective STL 学习笔记: 多用 vector & string

    Effective STL 学习笔记: 多用 vector & string 如果可能的话, 尽量避免自己去写动态分配的数组,转而使用 vector 和 string . 原书作者唯一想到的一 ...

  3. 浅谈C++三种传参方式

    浅谈C++三种传参方式 C++给函数传参中,主要有三种方式:分别是值传递.指针传递和引用传递. 下面通过讲解和实例来说明三种方式的区别. 值传递 我们都知道,在函数定义括号中的参数是形参,是给函数内专 ...

  4. Python 学习笔记 编程基础汇总000

    编程基础知识汇总000 1.计算机结构 2.编程语言分类 3.字符编码由来 计算机结构 计算机组成五大部件: 控制器.运算器.存储器.输入.输出 控制器(Controler):对程序规定的控制信息进行 ...

  5. python学习之路基础篇(三)

    博客参考:http://www.cnblogs.com/wupeiqi/articles/4943406.html http://www.cnblogs.com/luotianshuai/p/4949 ...

  6. Python学习之编程基础

    学习Python之前首先我们要了解Python是什么? question 1:Python是什么? answer:Python是一门编程语言.(什么是编程语言?) 语言:语言是不同个体之间沟通的介质. ...

  7. Java编程基础篇第三章

    逻辑运算符 与(&)(&&),或(||)(|),非(!) &和&&的区别 &:无论&的左边真假,右边都进行运算 &&:当 ...

  8. Python学习笔记之基础篇(三)python 数据类型 int str bool 详谈

     python 的数据类型: 1.int:存放 1,2,3 等数据 ,用于数字的运算 2.bool :True, False 用于判断 3.str:字符串,用来存储少量的数据 4.list : 数组的 ...

  9. vector作为参数的三种传参方式

    c++中常用的vector容器作为参数时,有三种传参方式,分别如下(为说明问题,用二维vector): function1(std::vector<std::vector<int> ...

随机推荐

  1. MT【57】2017联赛一试解答倒数第二题:一道不等式的最值

    注:康拓诺维奇不等式的应用

  2. 机器学习工作流程第一步:如何用Python做数据准备?

    这篇的内容是一系列针对在Python中从零开始运用机器学习能力工作流的辅导第一部分,覆盖了从小组开始的算法编程和其他相关工具.最终会成为一套手工制成的机器语言工作包.这次的内容会首先从数据准备开始. ...

  3. [CTSC2018] 假面 | 期望 DP

    题目链接 LOJ 2552 Luogu P4564 考场上这道题我先是写了个70分暴力,然后发现似乎可以NTT,然鹅问题是--我没学过NTT,遂脑补之,脑补出来了,下午出成绩一看,卡成暴力分(70)- ...

  4. tensorflow GPU版本安装及配置

    经检测速度大幅度上升,不枉费我折腾了这么久,最坑的就是网上教程.书都没有写将cuda的bin加入全局变量,还是根据报错信息推出来的. 1.cuda9.0下载安装 https://developer.n ...

  5. pip install时遇到MemoryError的原因和处理方法

    前言:同学们在用pip install的时候,可能会遇到MemoryError的问题 报错如下,看最后一行的memory error关键字: 报错的原因大致如下:(详细细节可以查看此处) This e ...

  6. c语言可变参

    一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,…),int ...

  7. JavaScript中解决jQuery和Prototype.js同时引入冲突问题

    两个库同时都定义了一个叫$的函数,所以在同时使用的时候会发生冲突.jQuery( http://jquery.com/ https://jquery.org/ )中提供了一种返还$的使用权给其他js库 ...

  8. 【洛谷P1429】平面最近点对

    题解:直接在输入点对的基础上建立 kd-tree,再每次以每个节点的坐标查询离这个点最近的点即可,同时需要忽略这个点本身对该点答案的贡献. 另外,直接在这些点上建立 kd-tree 会比一个一个插入点 ...

  9. 【洛谷P2617】Dynamic Rankings

    题目大意:维护带修改区间 K 小值. 题解:学习到了树状数组套权值线段树. 主席树,即:可持久化权值线段树,支持维护静态区间的 K 小值问题,其核心思想是维护 N 棵权值线段树,每个线段树维护的是序列 ...

  10. bug6 项目检出JRE问题(Unbound classpath container: 'JRE System Library [JavaSE-1.7]' in project 'idweb')

    项目从SVN检出到工作空间后报了很多错误,其中很明显就是一些jar的问题,没有相关的jar或版本问题,看到最后的错误Unbound classpath Container: 'JRE System L ...