首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

老梁聊C++为什么不能修改set里?如果非要修改怎么办?

说白了,也就是编译器进行了限制,不允许我们对set迭代内容进行修改。 Effective C++当中也明确说了,不要对set集合元素进行修改。...在我们开始之前,首先思考一个问题,既然set底层源码当中元素并不是定义成const,那么当我们去用迭代器去修改时候为什么会报错呢? 要回答这个问题,我们只需要查看一下set迭代源码定义即可。...主要原因是有时候我们手上变量有const修饰,但是我们想要调用一个函数,而函数内部会对指针或引用指向进行修改。...但是当我们运行代码之后,神奇事情发生了,屏幕上输出结果是这样为什么一个是3,另外一个是4呢?这两者逻辑明明是一样!...这也是为什么C++ Primer里强烈建议大家不要修改set中元素原因,如果真的要修改,只能先删除再添加了。虽然这样会牺牲一点点性能,但至少可以保证set里数据都是安全有序

98510

C语言学习——函数(含递归)

(6) 函数形式: ①无参函数:主调函数无数据传送给被调函数,带或不带返回。...②有参函数:主调函数与被调函数间有参数传递,主调函数可将实参传送给被调函数形参, 被调函数数据返回主调函数。...函数定义一般形式 无参函数定义形式 类型标识符: 用于指定函数带回类型,不写为int型。 不带回可以不写。...返回语句形式: return(表达式);或 return 表达式; 功能:使程序控制从被调用函数回到调用函数,同时把带给调用函数 说明: 函数返回,必须用 return 语句带回。...return 语句只能把一个传递给调用函数函数可有多个return语句,执行哪一个由程序执行情况来定。

69710
您找到你想要的搜索结果了吗?
是的
没有找到

C++基础入门丨6. 函数——定义、调用和声明

每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单程序都可以定义其他额外函数函数声明告诉编译器函数名称、返回类型和参数。函数定义提供了函数实际主体。...在函数定义 函数名:给函数起个名称 参数列表:使用该函数,传入数据 函数体语句:花括号内代码,函数内需要执行语句 return表达式: 和返回类型挂钩,函数执行完后,返回相应数据 2 函数调用...3 传递 函数传递也就是在函数调用时,实参将传递给形参。 传递,如果形参发生,并不会影响实参。...4 函数常见样式 4常见函数样式 样式 代码示例 无参无 void test01() 有参无 void test02(int a) 无参有 int test03() 有参有 int test04...函数实际主体可以单独定义。 当在一个源文件定义函数且在另一个文件调用函数函数声明是必需。在这种情况下,应该在调用函数文件顶部声明函数

1K10

也说说不知道Golang参数传递

导言 几乎每一个C++开发人员,都被面试过有关于函数参数是传递还是引用传递问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递行为。...众所周知,在任何语言中,传递指针类型参数才可以实现在函数内部直接修改内容,如果传递本身,会有一次拷贝发生(此时函数内外,该变量地址会发生变化通过第一个示例可以看出),因此,在函数内部修改对原外部变量是无效...因此,在golang,当map作为形参,虽然是传递,但是由于make()返回是一个指针类型,所以我们可以在函数哪修改map数值并影响到函数外。...到了这儿,似乎又一个奇怪现象出现了:makeslice()返回类型,但是当该数值作为参数传递,在函数内外地址却未发生变化,俨然一副指针类型。...总结 通过上述一系列总结,我们可以很高兴的确定是:在golang传参一定是传递了!

1.8K91

函数

() { int a = 1; int b = 2; //a和b称为实参,即有实际参数 //当调用函数,实参传递给形参 cout << add(a,b) <<...endl; return 0; }1.4 传递 所谓传递,就是函数调用时实参将数值传入给形参 传递,如果形参发生变化,并不会影响实参#define _CRT_SECURE_NO_WARNINGS...4种:1、无参无2、有参无3、无参有4、有参有1.6 函数声明作用:告诉编译器函数名称及如何调用函数。...1 //在源文件包含头文件,包含自己写头文件 用 双引号 #include "test.h" //函数定义放在源文件 //定义函数要在调用函数之前,否则会报找不到标识符错误,我们可以通过函数声明解决这个问题...int main() { int a = 1; int b = 2; //a和b称为实参,即有实际参数 //传递过程,形参改变并不会影响实参 cout

10810

C++快速扫盲(基础篇)

10; cout << "a = " << a << endl; system("pause"); return 0; } 注意:C++在创建变量,必须给变量一个初始,否则会报错 -...---- 标识符命名规则 作用:C++规定给标识符(变量、常量)命名,有一套自己规则 标识符不能是关键字 标识符只能由字母、数字、下划线组成 第一个字符必须为字母或下划线 标识符字母区分大小写...建议:给标识符命名,争取做到见名知意效果,方便自己和他人阅读 ---- 整型 作用:整型变量表示是整数类型数据 C++能够表示整型类型有以下几种方式,区别在于所占内存空间不同: 数据类型...常见函数样式有4种 无参无 有参无 无参有 有参有 示例: //函数常见样式 //1、 无参无 void test01() { //void a = 10; //无类型不可以创建变量,原因无法分配内存...作用: 利用指针作函数参数,可以修改实参 示例: //传递 void swap1(int a ,int b) { int temp = a; a = b; b = temp; } //地址传递

73320

开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

这也是为什么对a进行类型转换后赋值,但是a不发生变化 1.4引用使用场景 1.4.1做参数 在函数中使用引用作为参数,可以让你直接操作传递函数变量,而不是对其进行复制。...这样可以避免复制大型对象,提高效率,同时允许函数修改传递变量值(可以简单理解为:我们把别名传了过来,当然能通过别名来改变本身) void Swap(int& a, int& b)//交换两个整形...{ int temp = b; b = a; a = temp; } 1.4.2做返回C++ 函数可以返回引用,以避免在返回函数结果产生拷贝。...3.没有类型安全检查 为了解决缺点,c++采用: 常量定义 换用const enum 短小函数定义 换用内联函数 2.1内联函数概念 以inline修饰函数叫做内联函数,编译C...为了提高代码健壮性,在后续表示指针空建议最好使用nullptr 好啦,c++入门知识先到这里啦,下面就要开启面向对象篇章了。感谢大家支持!!!

18310

C++11『基础新特性』

C++11发布标志着C++语言现代化和进步,为程序员提供了更多工具和选项来编写高效、维护和现代代码 ️正文 1.C++11 简介 1.1.起源 1998 年 C++标准委员会 成立后,计划每五年进行一次更新...,这对于编码初始化是十分友好 2.1.对于内置类型 首先需要明白,为了适应 泛型编程,C++ 内置类型(比如 int、double 等)就已经全部配备了 构造函数,方便在进行模板传参传递默认构造...0 设成了 指针空,同时也设置成了 整型空,这是典型二义性,在进行参数传递,编译器无法区别 #ifndef NULL #ifdef __cplusplus #define NULL 0 #else...迭代器 遍历,只要容器支持 迭代器,那么就可以支持范围 for 比如使用 范围 for 遍历哈希表,实际获取就是哈希表 pair int main() { unordered_map<int...面向对象,成为一个单独类 提供迭代器,支持通过迭代器遍历 可以更轻易获取大小信息 对于数据访问方式更加丰富,同时下标随机访问,安全性更高 支持其他功能:判满、交换 这么看来似乎是全面升级,但别忘了

22240

面试题集锦

答:通常我们定义一个基本数据类型变量,一个对象引用,还有就是函数调用现场保存都使用内存栈空间;而通过new关键字和构造器创建 对象放在堆空间;程序字面量(literal)如直接书写100...第二道,好经典题,为此跟不少人争论过 当一个对象被当作参数传递到一个方法后,此方法改变这个对象属性,并可返回变化后结果,那么这里到底是传递还是引用传递? 答:是传递。...Java语言方法调用只支持参数传递。当一个对象实例作为一个参数被传递到方法,参数就是对该对象引用。对象 属性可以在被调用过程中被改变,但对对象引用改变是不会影响到调用者。...C++和C#可以通过传引用或传输出参数来改变传入参数。在C#可以 编写如下所示代码,但是在Java却做不到。   ...这就是为什么正确永久代大小对避免Full GC是非常重要原因。

43441

C++-带你深度理解string类常见接口

C语言中,字符串是以'\0'结尾一些字符集合,为了操作方便,C标准库中提供了一些str系列函数,但是这些库函数与字符串是分离开,不太符合OOP思想,而且底层空间需要用户自己管理,稍不留神...在OJ,有关字符串题目基本以string类形式出现,而且在常规工作,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库字符串操作函数。 2....2.2.4.3c++swap c++库里面有一个swap函数,用起来非常方便,库里面的swap是一个函数模板,所以可以支持各种数据类型。...2.2.4.4迭代c++里面还有一个东西可以支持大部分数据类型遍历,那就是迭代器(iterator),迭代器不仅可以遍历,还可以修改,迭代器是主流访问容器一种方式。...resize数据要大,保证空间足够,size则为resize大小,resize如果比之前容量大,则会发生扩容,那么resize之后数据既然是100了,那么当我们打印出来时候,为什么什么都看不见呢

11110

C++】如果你准备学习C++,并且有C语言基础,我希望你能简单过一遍知识点。

语法: char sb = 'a'; /*注意:显示字符型变量用单引号括起来,不是双引号。单引号内只能有一个字符,不可以是字符串。*/ C和C++字符型变量只占1个字节。...功能:使用定义好函数 语法:函数名(参数) 传递 就是函数调用时将参数值传给形参 传递,如果形参发生变化,并不会影响到实参 函数常见样式 无参无、有参无、无参有、有参有 函数声明...头文件里面放函数声明,函数定义放到.c文件里 指针 概念 指针作用:可以通过指针间接访问内存。...定义和使用 语法: struct 结构体名称{ 结构体成员列表}; 通过结构体创建变量方式有三种 struct 结构体名 变量名 struct 结构体名 变量名 = (成员1,成员2…) 定义结构体顺便创建变量...作用:将结构体作为参数向函数传递 传递方式有两种 同上函数参数-指针 传递-无法改变实参 地址传递-可以改变实参 结构体const使用场景 作用:用const来防止误操作 void ChangeInformation

64810

C++基础快速入门

函数定义 函数名:给函数起个名称 参数列表:使用该函数,传入数据 函数体语句:花括号内代码,函数内需要执行语句 return表达式: 和返回类型挂钩,函数执行完后,返回相应数据 示例:...传递 所谓传递,就是函数调用时实参将数值传入给形参 传递,如果形参发生,并不会影响实参 示例: void swap(int num1, int num2) { cout << "交换前:" <...6.5 函数常见样式 常见函数样式有4种 无参无 有参无 无参有 有参有 示例: //函数常见样式 //1、 无参无 void test01() { //void a = 10;...,用来解决实际问题 8.6 结构体做函数参数 作用: 将结构体作为参数向函数传递 传递方式有两种: 传递 地址传递 示例: //学生结构体定义 struct student { //成员列表 string...:" << stu.score << endl; system("pause"); return 0; } 总结:如果不想修改主函数数据,用传递,反之用地址传递 8.7 结构体 const

14910

100 个基本 Python 面试问题第四部分(81-100)

Q-28:Python “按引用调用”是什么? Q-29:trunc() 函数返回是多少? Q-30:Python 函数必须返回一个吗?...在使用迭代,有时我们可能有一个用例来存储迭代次数。Python 通过提供一个称为 enumerate() 内置方法让我们很容易地完成这项任务。...enumerate() 函数将计数器变量附加到迭代对象,并将其作为“枚举”对象返回。 我们可以直接在“for”循环中使用这个对象,或者通过调用 list() 方法将它转换成一个元组列表。...Python 生成器是一个返回迭代对象函数。我们可以使用yield 关键字迭代生成器对象。但是我们只能这样做一次,因为它们不会持久存在于内存,它们会即时获取值。...当我们不想要所有结果并希望推迟一段时间,生成器很有用。 我们可以用生成器代替回调函数,而不是使用回调函数。我们可以在函数内部编写一个循环,做与回调相同事情,并将它变成一个生成器。

3.6K31

由 Go 结构体指针引发传递思考

这篇笔记思考开始于一篇帖子中提问题:下面这段代码,都是从 map 取一个元素并调用其方法,为什么最后一行无法编译通过 import "testing" type S struct { Name...map 传递 在 Go ,所有的函数参数和返回都是通过传递,这意味着它们都是原始数据副本,而不是引用或指针。...这两种传递方式决定了函数调用时参数是如何传递传递传递复制数据 引用传递:引用传递复制是数据地址 Go 采用就是传递,当调用一个需要参数函数函数参数会复制一份,如果参数是一个指针...,通过传递指针,可以实现在函数内部修改对象效果,所以 Go 支持引用传递,而事实上这里面依旧是传递,只不过复制是指针本身。...无论是类型还是引用类型(如指针),在作为参数传递函数都是通过传递方式。

18710

C++基础入门_C语言入门基础

注意:C++在创建变量,必须给变量一个初始,否则会报错 1.4 常量 作用:用于记录程序不可更改数据 C++定义常量两种方式 #define 宏常量: #define 常量名 常量值...在函数定义 函数名:给函数起个名称 参数列表:使用该函数,传入数据 函数体语句:花括号内代码,函数内需要执行语句 return表达式: 和返回类型挂钩,函数执行完后,返回相应数据 示例:定义一个加法函数...,函数调用时传入参数称为实参 6.4 传递 所谓传递,就是函数调用时实参将数值传入给形参 传递,如果形参发生改变,并不会影响实参 示例: void swap(int num1, int num2...endl; cout << "main b = " << b << endl; // 10 // 20 system("pause"); return 0; } 总结: 传递,形参是修饰不了实参...传递,不影响实参 6.5 函数常见样式 常见函数样式有4种 无参无 有参无 无参有 有参有 示例: //函数常见样式 //1、 无参无 void test01() { //void

5.6K20

C++入门

缺省参数 缺省参数概念 缺省参数是声明或定义函数函数参数指定一个缺省。在调用该函数,如果没有指定实参则采用该形参缺省,否则使用指定实参。...其实在我们今后学习回经常使用,例如之前学习链表和顺序表扩容中就可以使用缺省参数来简化代码,我们指定容量缺省为4,当我项目对于顺序表需求很大,我们直接给个100,如果不用就可以不用管它了...传、传引用效率比较 以作为参数或者返回类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用作为参数或者返回类型,效率是非常低下...也就是说,在平常函数使用,我们回在用汇编语言中call 指令来返回到函数,这就浪费了时间,而被inline修饰内联函数就是直接将函数体来代替此处函数调用指令,但是增大了空间开销 所以:...auto简介 在早期C/C++auto含义是:使用auto修饰变量,是具有自动存储器局部变量,但遗憾是一直没有人去使用它,大家思考下为什么

9010

经典面试题(三)之栈详解

;当函数调用发生函数调用关系等信息会动态地保存在内存栈区,以供处理器在执行完被调用函数代码冋母函数。...当CPU在执行调用func_A函数时候,会从代码区main函数对应机器指令区域跳转到func_A函数对应机器指令区域,在那里取指并执行;当函数执行完闭,需要时候,又会跳回到main函数对应指令区域...在func_A同时,func_A栈帧被弹出系统栈.macn函数栈帧返回地址被“露” 在栈顶,此时处理器按照这个返回地址跳到main函数代码区执行。...具体,对于Visual C++来说,支持以下3函数调用约定,如表2-1-2所示: ?...例如,每一个c++类成员函数都有一个this指针,在Wndows平台中,这个指针一般是用ECX寄存器来传递,但如果用GCC编译器编译,这个指针会作为最后一个参数压入栈

1.2K30

Golang函数传参存在引用传递吗?

Go slice 在传入函数到底是不是引用传递?如果不是,在函数为什么能修改其?...传递 传递是指在调用函数将实际参数复制一份传递函数,这样在函数如果对参数进行修改,将不会影响到实际参数。 概念总给人一种教科书感觉,写点代码验证下。...图中 &a 表示a地址,为: 0xc420080008 引用传递 所谓引用传递是指在调用函数将实际参数地址传递函数,那么在函数对参数所进行修改,将影响到实际参数。...如果go存在引用传递,形参 s 地址应该与实参 s1 一样(上面c++证明),通过实际情况我们发现它们具备完全不同地址,也就是传参依然发生了拷贝——传递。...小结 Go 函数传参仅有传递一种方式; slice、map、channel都是引用类型,但是跟c++不同; slice能够通过函数传参后,修改对应数组,是因为 slice 内部保存了引用数组指针

2.2K20

C# 委托基础

这里就使用到了委托概念,将方法传递给线程! 2、委托特性        在C和C++,只能提取函数地址,该地址可以作为参数传递给任何需要它函数,这种方法会导致类型安全问题。...但是在.Net Framework,当我们进行面向对象编程时候,几乎没有方法是孤立存在,当我们吊用一个方法前,必须确保这个方法与类实例关联,所以在.Net Framework不允许直接使用方法,...或者传递方法,如果需要传递方法,那么必须把该方法细节和参数封装在一个类对象,通过传递对象实例方式,来传递方法。...通过委托实例来传递方法,所以委托和类其实在某种程度上说是一样,委托是一种特殊类。这种类,专门负责传递方法。...b、通过一个委托调用多个方法还可能导致大问题,当一个方法抛出异常,整个迭代就会停止 b实现代码如下: class Program { static void Main(

62450

C++修炼之路】1. 初窥门径

,存在着rand()函数,因此当我们定义全局变量rand = 10,就会产生命名冲突,因为rand原本已经代表着函数名,是函数地址,因此上述定义会报错。...4.3 C++支持函数重载原理–名字修饰 为什么C++支持函数重载,而C语言不支持函数重载呢? 在C/C++,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。...,传入参数是sl地址,因此当我们返回,返回是这个变量引用,也就是别名,与原来变量是同一个变量,因此我们通过引用返回之后可以直接对返回进行修改,最终实现Modify具有的修改功能!...5.6 传、传引用效率比较 以作为参数或者返回类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用作为参数或者返回类型,效率是非常低下...指针空nullptr(C++11) 9.1 C++98指针空 在良好C/C++编程习惯,声明一个变量最好给该变量一个合适初始,否则可能会出现不可预料错误,比如未初始化指针。

1K00
领券