读C++ Primer有感

news2024/11/16 8:54:08

文章目录

      • 类型转换:
        • 强制类型转换
      • 标准库类型vector
        • 迭代器:
        • 数组
        • 数组形参
        • 可变形参的函数
        • 迭代器失效问题
        • IO
        • 泛型算法

类型转换:

​ 无符号(0-255)
​ 当赋给一个超出表示范围之后,初始值对无符号类型表示数值总数取模后的余数

unsigned char c = -1;	//c的值为255
int i = -42;
unsigned u =10;
cout<<i-u;          //42949672764

首先把整数-42转换成无符号数。类似于直接给无符号数赋一个负值,结果等于这负值加上无符号数的模。

String:
在cin>>字符串的时候遇到空格就会读取结束
例:Hello World,输出Hello,输出结果没有任何字符
比较:如果两个string对象在某些位置上不一致,结果就是string对象中第一对相异字符比较的结果
加法运算符的两侧的对象至少是一个string
string s1 = "hello";
string s2 = s1 + ',' + "world" + ","+'\n';//ok
//拆分 s2=(s1+',')+"world"
string s3 = "hello" + ","+s2;//err 不能把字面符直接相加
string s4 = "hello" + '\n';//ok

强制类型转换
  1. static_cast:任何具有明确定义的类型转换,只要不包含底层 const,都可以使用static_cast;int i,j;double slope = static_cast<double>(j) / i;,static_cast可以改变表达式的类型。
  2. const_cast:只能改变运算对象的底层const,只有const_cast能改变表达式的常量属性。(重载函数上下文使用 )

标准库类型vector

编译器根据模板创建类或函数的过程称为实例化
对于vector对象来说,直接初始化的方式适用于三种情况:一是初始值已知且数量较少;二是初始值是另一个vector对象的副本;三是所有初始值一样。
如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for语句
注意:vector对象(以及string对象)的下标运算符可用于访问已存在的元素,而不能用于添加元素

迭代器:

但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素,会失效。
两个迭代器不能进行加法运算:mid = (beg+end) /2;//err
C++定义了迭代器的减法运算和迭代器与整数的加减运算,所以有序二分搜索使用mid = beg + (end-beg)/2
tip:如果不清楚元素的个数,请使用vector

数组

数组的维度必须是常量表达式

unsigned int cnt = 42;
const unsigned int sz = 42;
int *pattr[sz];
string bad[cnt];//cnt不是常量表达式
string strs[get_size()];//当get_size是constexpr是正确;否则错误

不允许拷贝和赋值

int a[] = { 0, 1, 2 };
int a2[] = a;//错误,不允许使用一个数组初始化另一个数组
a2 = a;//错误,不能把一个数组直接赋值给另一个数组

定义在全局作用域中的int类型数组默认初始化为0,而在局部就是一个未定义的奇异值;对于string类型的数组,不论在函数内还是函数外都默认初始化为空串。

相比于 vector 来说,数组有哪些缺点. 请列举一些。

【解答】 数组与 名字,需要通过其所在位置访问。 数组与 额外的元素,虽然在某些情境下运行时性能较好,但是与 vector 相比损失了灵活 vector 的相似之处是都能存放类型相同的对象,且这些对象本身没有 vector 的最大不同是,数组的大小固定不变,不能随意向数组中增加性。

具体来说,数组的维度在定义时己经确定,如果我们想更改数组的长度,只能创建一个更大的新数组,然后把原数组的所有元素复制到新数组中去。我们也无法 像 vector 那样使用 size 函数直接获取数组的维度。如果是字符数组,可以调用 strlen 函数得到字符串的长度 : 如果是其他数组 , 只能使用 sizeof (array) /sizeof (array[0] )的方式计算数组的维度。

尾后指针不能执行解引用和递增操作

怎么区分顶层const和底层const?

指针本身是个常量表示顶层常量const;指针所指的对象是一个常量表示底层const,声明引用的const都是底层const。

int i = 0;
int *const p1 = &i;		//顶层
const int ci = 42;		//顶层
const int *p2 = &ci;		//底层
const int const*p3 = p2;	//左边的const是底层,右边的const是顶层
const int &r = ci;		//声明引用的const,都是底层const
数组形参

如果传给函数的是一个数组,则实参自动转换成指向数组首元素的指针。

管理指针形参有三种方式:

  1. 要求数组本身包含一个结束标记,字符串最后一个字符为空字符。void print(const char * cp)if(cp) while(*cp)cout<< *pt++;
  2. 传递指向数组首元素和尾后元素的指针。while(beg!=end)
  3. 定义一个表示数组大小的形参 (size) int j[]={0,1}print(j,end(j)-begin(j));
可变形参的函数

initializer_list:实参数量未知但所有实参类型相同

initializer_list<T>lst{a,b, c…};

迭代器失效问题

向容器中添加元素和从容器中删除元素的操作可能会使指向容器元素的指针、引用或迭代器失效。一个失效的指针、引用或迭代器将不再表示任何元素。

程序必须保证每个循环步中都更新迭代器、引用或指针。让这些操作都返回迭代器iter = vi.insert(inter,1)//插入1;iter = vi.erase(iter)//删除iter的当前元素

不能保存end返回的迭代器

vector<int> v = {0,1,2,3,4,5};
auto begin = v.begin(),
	end = v.end();	//保存尾迭代器的值是一个坏主意
while( begin != end )
{;
	begin = v.insert(begin,42);//插入新值
	begin += 2;//向后移动迭代器,跳过当前元素以及插入到它之前的元素
}

这里不要缓存end返回的迭代器 ,在每个循环步添加/删除元素后都重新计算end:while( begin != v.end())更安全。

image-20230913191755343
IO

IO属于不能被拷贝的类型,所以通过引用传递

ostream &print(istream &os ,const Sales_data &item)

构造函数没有返回类型,不能声明const

泛型算法

泛型算法不会执行容器的操作,算法永远不会改变容器大小。

特点:算法是通过迭代器操作容器,因此不能直接向/从容器添加、删除算法,无法改变容器大小

vector<string>words;
string word;// 不能直接操作容器words,分配一个内置类型变量操作
while(in>>word)
words.push_back(word);//让word尾插到容器words中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1142964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[精选好文] ElasticSearch入门到实战教程

给大家分享一个比较好的ElasticSearch教程&#xff0c;ES常用的语法&#xff0c;API都有总结&#xff0c;大家工作时候可以直接翻开用。 地址&#xff1a;点击查看

学习笔记:并查集

并查集 并查集被很多 OIer \texttt{OIer} OIer 认为是最简洁而优雅的数据结构之一&#xff0c;主要用于解决一些 元素分组 的问题。它管理一系列 不相交的集合&#xff0c;并支持两种操作&#xff1a; 合并&#xff1a;把两个不相交的集合合并为一个集合。查询&#xff1a;查…

Windows VS C++工程:包含目录、库目录、附加依赖项、附加包含目录、附加库目录配置与静态库、动态库的调用

文章目录 1 包含目录/附加包含目录1.1 区别和作用1.2 设置路径 2 库目录/ 附加库目录2.1 用途2.2 设置路径 3 附加依赖项3.1 用途3.2 设置路径 4 注意运行库的设置4 静态链接库调用方法5 动态链接库的调用方法 利用Visual Studio编写C工程文件时&#xff0c;时常需要自行配置自…

SQL中:语法总结(group by,having ,distinct,top,order by,like等等)

语法总结&#xff1a;group by&#xff0c;distinct ...... 1.group by2.聚集函数count 3.order by4.增insert、删&#xff08;drop、delete&#xff09;、改&#xff08;update、alter&#xff09;5.查select嵌套查询不相关子查询相关子查询使用的谓词使用的谓词子查询的相关谓…

大厂面试题-JVM中的三色标记法是什么?

目录 问题分析 问题答案 问题分析 三色标记法是Java虚拟机(JVM)中垃圾回收算法的一种&#xff0c;主要用来标记内存中存活和需要回收的对象。 它的好处是&#xff0c;可以让JVM不发生或仅短时间发生STW(Stop The World)&#xff0c;从而达到清除JVM内存垃圾的目的&#xff…

蓝桥杯每日一题2023.10.27

题目描述 快速排序 - 蓝桥云课 (lanqiao.cn) #include <stdio.h>int quick_select(int a[], int l, int r, int k) {int p rand() % (r - l 1) l;int x a[p];{int t a[p]; a[p] a[r]; a[r] t;}int i l, j r;while(i < j) {while(i < j && a[i] &…

centos 8 yum源不能使用问题

问题&#xff1a;新安装的centos 8 不能使用wget就不能下载和安装其他的软件 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 解决&#xff1a; [rootlocalhost ~]# cd /etc/yum.repos.d [rootlocalhost yu…

栈、队列、矩阵的总结

栈的应用 括号匹配 表达式求值&#xff08;中缀&#xff0c;后缀&#xff09; 中缀转后缀&#xff08;机算&#xff09; 中缀机算 后缀机算 总结 特殊矩阵 对称矩阵的压缩存储 三角矩阵 三对角矩阵 稀疏矩阵的压缩存储

windows服务器环境下使用php调用com组件

Office设置 安装 office2013 且通过正版激活码激活 在组件服务 计算机 我的电脑 DOM 中找到 Microsoft Word 97 - 2003 文档 服务&#xff0c;右键属性 身份验证调整为 无 在 标识中 调整为 交互式用户 php环境设置 开启com组件扩展 在php.ini中设置 extensionphp_com_dotn…

关于亚马逊 CodeWhisperer 的测试反馈

CodeWhisperer 是亚马逊推出的实时 AI 编程助手&#xff0c;是一项基于机器学习的服务&#xff0c;它可以分析开发者在集成开发环境&#xff08;IDE&#xff09;中的注释和代码&#xff0c;并根据其内容生成多种代码建议。 亚马逊云科技开发者社区为开发者们提供全球的开发技术…

python---continue关键字对for...else结构的影响

代码&#xff1a; str1 laowang for i in str1:if i w:print(遇w不打印)continueprint(i) else:print(循环正常结束之后执行的代码) 图示&#xff1a;

速卖通商品详情API接口(标题|主图|SKU|价格|商品描述)

速卖通商品详情接口的用途是获取商品信息。 速卖通商品详情接口可以获取到商品的完整详细信息&#xff0c;包括商品名称、价格、图片、描述、规格、库存等&#xff0c;这些信息能够帮助用户了解商品特点、性能和市场定位&#xff0c;并做出购买决策。同时&#xff0c;通过使用…

0基础学习VR全景平台篇第114篇:全景图优化和输出 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 前情回顾&#xff1a;之前&#xff0c;我们详细介绍了如何用编辑器、控制点、垂直线等功能优化错位和矫正水平&#xff0c;然而这些调整不会马上生效。 我们需要在【优化】选项卡…

react-native调试

一、调试页面js代码 我用的真机调试&#xff0c;手机摇晃会出现出现的页面&#xff0c;点击debug 点击debug后&#xff0c;页面会出现&#xff0c;点按提示操作快捷键会出现开发者工具 注意&#xff1a;Chrome 中并不能直接看到 App 的用户界面&#xff0c;而只能提供 consol…

百度超级链XuperChain使用JavaSDK接入

环境 &#xff1a; ubuntu20 xuperchain 5.3 go 1.17 springboot : 2.5.14 前言 请提前启动好xchain的节点&#xff0c;我选择简单启一个xchain节点作为测试&#xff0c;并且使用默认端口37101 SpringBoot项目初始化 我们先进行SpringBoot项目的配置进行讲解&#xff0c;这里…

安卓逆向之雷电模拟器中控

一, 雷电模拟器 安装使用 官方地址: https://www.ldmnq.com ,官方论坛 https://www.ldmnq.com/forum/ . 有一个多开管理器,还有就是设置手机的参数比较关键。 二,雷电模拟器开启面具,安装LSP。 设置root 权限。

搜索引擎搜索技巧总结

晚上在B站上刷到一个关于搜索技巧的干货视频&#xff0c;这个视频真的不错&#xff0c;结尾还提到了AI时代的搜索思路之前自己也零碎的探索出了一些搜索技巧&#xff0c;但是没有总结&#xff0c;就没法稳定的加入自己的工作流&#xff0c;持续提高效率受到这个视频的启发&…

线扫相机DALSA--分频倍频计算公式及原理

分频倍频计算公式及原理 推导原理&#xff1a; 假设编码器脉冲精度为P&#xff1b;同步轮/辊周长为C&#xff0c;Fov为视野&#xff0c;Res为线扫相机分辨率&#xff0c;N代表N倍频编码器&#xff0c;分频为D&#xff0c;倍频为M 线扫项目常规采用N&#xff08;N 4&#xff0…

化身全能战士:ChatGPT助我横扫办公室【文末送书两本】

化身全能战士&#xff1a;ChatGPT助我横扫办公室 半年签约 16 本书有 ChatGPT 不会的吗&#xff1f;解锁 ChatGPT 秘技&#xff0c;化身全能战士ChatGPT 基本知识办公自动化职场学习与变现 作者简介结语购买链接参与方式往期赠书回顾 &#x1f3d8;️&#x1f3d8;️个人简介&a…

用HTML+CSS+JS实现一个简单的弹幕滚动留言板

在线演示地址&#xff1a;https://www.ewbang.com/community/board.html 本文利用HTMLCSSJS写了一个简单的弹幕滚动留言板小功能。 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html;charsetutf-8" /&…