C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放

2024-03-20 17:58

本文主要是介绍C++ primer (5th) 随想与学习笔记 5 不为指针操心 新标准更开放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第三章 字符串、向量和数组

3.1 命名空间的using声明

标准形式using namespace::name,不要在头文件中使用using声明。

3.2 标准库类型string

using std::string
string 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 不为指针操心 新标准更开放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830277

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]