C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放
来源:互联网 发布:ubuntu安装有道词典 编辑:程序博客网 时间:2024/05/16 17:56
第三章 字符串、向量和数组
3.1 命名空间的using声明
标准形式using namespace::name,不要在头文件中使用using声明。
3.2 标准库类型string
using std::stringstring s1; //默认初始化string s2 = s1;//拷贝string s3 = "hiya";//字面值副本string s4(10,'c');//重复c
注意s4变量中的第二个参数是一个字符(不是字符串)。string类型定义了很多操作,+运算的两侧对象至少有一个是string类型,细节要注意,比如string s5 = s1 + "Hello, "+'\n'是可以的,这相当于string s5 = (s1 + "Hello, ")+'\n',s1和“Hello”相加完后还是string类型,加法运算是由左往右的,同样string = "Hello, " + "World" + s1;就是错误的。为了和C兼容,字符串的字面值“Hello World”不是string类型。
练习 3.2
#include <iostream>#include <string>using std::string;using std::cout;using std::cin;using std::endl;int main(){ string sline; while(getline(cin,sline)) ; return 0;}练习 3.4
#include <iostream>#include <string>using std::string;using std::cout;using std::cin;using std::endl;int main(){ string sword1; string sword2; cin >> sword1 >> sword2; if(sword1 < sword2) cout << sword2; if(sword1 > sword2) cout << sword1; return 0;}
题目挺简单的,也不准备做了,有了C基础没必要做这些题,想通了就行了。
c++是这样兼容C的,比如C语言中的头文件ctype.h,在C++中变成了cctype,去掉了.h后缀,前缀加了c字母表示来自于C语言。using std空间是识别不了.h的头文件的,这样cname更符合C++的风格。
C++11标准增添了范围for语句,表示为for (declaration : expression)statement,这里学的是python吧!
数组s[n]是引用的意思啊,以前C没注意到!使用string变量前,确保string变量不为空。
3.3 标准库类型vector
vector中的类型是都要相同的,这和python有很大不同。也常被称作容器(container),这对我来说是新知识!
vector的列表初始化还是挺深奥的值得学习,很像python,另外在C++中指定vector的大小是不值得的,这和c与JAVA和不同,记得MATALB语言数组是必须预申请的否则内存溢出。因此这里虽然不用定义它的大小,但在使用中要确定循环正确无误。循环体中不能使用范围for语句来添加元素。添加元素的方法是push_back()函数。不存在的元素是不可以用下标访问的。
3.4 迭代器介绍
除了通过下标运算符,也可以使用迭代器(iterator)。好像有点像指针,C++建议养成使用迭代器和!=(不用<、>)的习惯,因为这种风格在所有标准库中的容器都有效。
谨记:不能在使用迭代器的循环体内添加自身容器的元素,这里作者提到了向量,应该就是容器吧?
#include <iostream>#include <string>#include <vector>using std::cout;using std::cin;using std::endl;using std::string;using std::vector;int main(){ vector<int> inum{2,3,45,6,2,5,88,33,23,45}; for (auto it = inum.begin(); it != inum.end(); ++it) *it *= *it; return 0; }
这里介绍了二分搜索法,记录一下
auto beg = text.begin(), end = text.end();auto mid = text.begin() + (end - beg)/2;while (mid != end && *mid != sought){ if(sought < *mid) end=mid; else beg = mid + 1; mid = beg + (end - beg)/2;}
3.5 数组
恒定大小的vector就是数组?数组的大小在定义时就要确定,不确定(用变量赋值)就是错误的做法。定义数组是不可用auto类型,元素应为对象,且不存在引用的数组。数组不可给别的变量赋值或者初始化。
范围for语句用法比vector简单,因为数组的维度大小在定义时系统就已经知道,减轻控制遍历的步骤。
C++11新标准在iterator头文件中定义了begin()和end()函数,用于获取数组的首地址和尾地址加+1,但也可使用&arr[n]获得尾地址,另外记得尾后指针(尾地址)不可解引用和递增。
内置的下标运算所用的索引值不是无符号类型!string和vector是无符号类型。
这里把C语言的字符串风格说的一文不值,哈哈,的确,毕竟C语言用的都是函数啊!以后尽量用string函数库吧。C++考虑到和C的兼容,提供了很实用的接口,来转变在C语言基础上写成的C++代码。比如:
<span style="font-size:14px;">char *str = s; //错误:C风格const char *str = s.c_str();//正确</span>
最好str重新拷贝一份,防止s在别的地方被修改。
数组虽然不可以为内置类型初始化或赋值,但可以给vector初始化:
int int_arr[] = {0,1,2,3,4,5 };vector<int> ivec(begin(int_arr), end(int_arr));
也可以使用部分数组:
<span style="font-size:14px;">vector<int> subVec(int_arr + 1, int_arr +4);</span>
和python挺像的,看好这里只赋了4-1=3个值!反之,vector也可这样使用给数组初始化。
建议尽量使用标准库忘了数组吧,忘了C语言吧,呵呵!
3.6 多维数组
用数组的数组比较容易理解多维数组。处理多维数组时用范围for语句要使用引用类型。这里把C++11新标准添加的auto类型和begin(end)函数的功能和优势发挥的淋漓尽致!!再也不用担心指针了。
- C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放
- C++ primer (5th) 随想与学习笔记 4 基本类型很全面 新标准更灵活
- C++ primer (5th) 随想与学习笔记 6 优先级晦涩难通 新标准更清晰
- C++ primer (5th) 随想与学习笔记 7 执行流程永不变 新标准添精彩
- C++ primer (5th) 随想与学习笔记 8
- C++ primer (5th) 随想与学习笔记 1 谈谈坚持的方法与意义
- C++ primer (5th) 随想与学习笔记 2 怎样在Linux上安装GCC
- C++ primer (5th) 随想与学习笔记 3 小试牛刀管中窥豹
- C Primer plus 5th 第七章学习笔记 break 与continue
- C++Primer(5th)学习-数组篇
- <C++ Primer 5th 学习笔记>1
- 《C Primer Plus 5th》读书笔记-----指针和多维数组
- C++primer 指针学习笔记
- C++Primer(5th)第三章学习总结-vector篇
- 《C++Primer 5th》 读书笔记1---内存与初始化
- 《C++ Primer 5th edition》学习笔记(1)
- const笔记(学习c++ primer 5th)
- C++primer学习笔记第四章-数组与指针
- Linux server 杂谈
- JNI学习笔记——创建JAVA对象和内部类需注意
- 奇偶数排序,荷兰国旗问题
- 设计模式的再研究(策略模式和观察者模式的结合)
- 主编 PHP 计算页面执行时间
- C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放
- 解决Dynamic Web Module 3.0 requires Java 1.6 or newer.问题
- 第五章表达式
- MFC TreeCtrl 控件(一):简单使用
- leetcode: Minimum Path Sum
- 近期学习计划
- Raphael.js API之Element.mousedown(),Element.mousemove(),Element.mouseup(),Element.mouseout(),Element.
- perl函数说明(die)
- 【转】Spring事务配置和隔离级别