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

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

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

1.3K20

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

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

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

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

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

    1.6K10

    也说说不知道的Golang中参数传递

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

    1.8K91

    函数

    () { int a = 1; int b = 2; //a和b称为实参,即有实际的参数 //当调用函数时,实参的值会传递给形参 cout 值传递 所谓值传递,就是函数调用时实参将数值传入给形参 值传递时,如果形参发生变化,并不会影响实参#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

    11910

    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; } //地址传递

    76320

    开启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++入门的知识先到这里啦,下面就要开启面向对象的篇章了。感谢大家支持!!!

    25010

    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的类 提供迭代器,支持通过迭代器遍历 可以更轻易获取大小信息 对于数据的访问方式更加丰富,同时下标随机访问时,安全性更高 支持其他功能:判满、交换 这么看来似乎是全面升级,但别忘了

    31140

    面试题集锦

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

    44641

    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了,那么当我们打印出来的时候,为什么什么都看不见呢

    14610

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

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

    73710

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

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

    3.6K31

    C++基础快速入门

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

    19510

    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.7K20

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

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

    23910

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

    ;当函数调用发生时,函数的调用关系等信息会动态地保存在内存的栈区,以供处理器在执行完被调用函数的代码时,返冋母函数。...当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.3K30

    C++入门

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

    10410

    C# 委托基础

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

    65350

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

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

    2.3K20

    【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++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。

    1.1K00
    领券