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

begin()和end()不应该只对类的l值引用可调用吗?

begin()和end()是C++标准库中的迭代器函数,用于返回指向容器中第一个元素和最后一个元素之后位置的迭代器。

在C++中,begin()和end()函数不仅可以用于类的l值引用,也可以用于类的r值引用。这是因为C++标准库中的容器类都提供了对应的成员函数begin()和end(),它们分别返回容器的起始迭代器和结束迭代器。

对于类的l值引用,可以直接调用begin()和end()函数来获取容器的迭代器。例如:

代码语言:txt
复制
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = vec.begin();  // 获取容器的起始迭代器
auto endIt = vec.end();  // 获取容器的结束迭代器

对于类的r值引用,可以使用std::move()函数将其转换为l值引用,然后再调用begin()和end()函数。例如:

代码语言:txt
复制
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::move(vec).begin();  // 获取容器的起始迭代器
auto endIt = std::move(vec).end();  // 获取容器的结束迭代器

需要注意的是,对于r值引用,调用begin()和end()函数后,原容器的状态会发生改变,因为r值引用的资源会被移动或转移。因此,在使用r值引用调用begin()和end()函数后,应该避免再次使用原容器。

总结起来,无论是类的l值引用还是r值引用,都可以使用begin()和end()函数来获取容器的迭代器,以便进行遍历或其他操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python(四)

默认参数有个最大坑,如下: def add_end(L=[]): L.append('END') return L add_end() # ['END'] add_end() #...['END', 'END'] 原因解释如下: Python 中函数在定义时候,默认参数 L 就被计算出来了,即 [],因为默认参数 L 也是一个变量,它指向对象 [],每次调用该函数,如果改变了...在 Python 中,是通过 _ 前缀来实现。 正常函数变量名是公开(public),可以被直接引用。...类似 _xxx __xxx 这样函数或变量就是非公开(private),不应该被直接引用。...之所以我们说,private 函数变量”不应该”被直接引用,而不是”不能”被直接引用,是因为 Python 并没有一种方法可以完全限制访问 private 函数或变量,但是,从编程习惯上不应该引用 private

23420

【C++】STL——list深度剖析 及 模拟实现

我们发现迭代器这个模板其实就是对结点指针进行了一个封装。 但是,迭代器要能++找到下一个结点位置迭代器,还要能够解引用取到结点里面的等等一系列操作,怎么办?...=: beginend 然后我们在list里面加一个beginend就可以用迭代器了: 那begin就是返回第一个元素位置(即头结点后面)迭代器,end就是返回最后一个元素下一个位置(即头结点位置...然后,我们list里面就可以实现const版本beginend了: 那这样的话,我们print_list函数里面: 这个地方换成const_iterator就行了。...那这样是不是太冗余了呀,那我们能不能想想办法,只写一个,就搞定这两种情况呢,其实就是控制一下这里operator*返回,const对象调用就返回const引用,普通对象调用就返回引用。...大家看it->_a1,这样写对? it->是不是it去调用operator->这个函数了,那它返回是啥?

19310
  • C++编程规范(五)

    vector,再后是set或map 2, 用vectorstring代替数组 例外:如果编译时数组大小就是固定,则也可以考虑数组 3,在使用容器时候只存储智能指针迭代器 比如 vector...,set,如果容器拥有所指向对象,则应该使用引用计数智能指针容器 list>, 否则使用原始指针容器list或者其他类似指针比如迭代器...理由:Remove算法并不真正地从容器中删除元素,所做就是移动位置,将不应该删除元素移动到范围开始处,并返回一个迭代器指向最后一个不应该删除元素下一个位置,要真正删除,需要在调用remove...之后再调用erase: c.erase(remove(c.begin(), c.end(),value), c.end()); remove remove_if 7, 用算法调用代替手工编写循环方式...it=find(l.begin(),l.end(), 10); 对于成员需要重载: Class Person{ Public: Persion(); ~Persion(

    58620

    双向链表模板实现

    全部代码加详细注释 List.hpp写法1----将迭代器,节点链表分开写,变量不统一,书写较麻烦 /***************Node结点定义************/ template...,这里是常迭代器 //这里前置const规定了返回不能修改,这里返回是指针指向地址,因此这里不能修改指针指向指向 const T& operator*()const...const List& operator=(const List& L); //迭代器中转换构造是在beginend函数里面使用 //开始迭代器---返回迭代器已经可以间接操作...= L.End(); ++itr) { push_back(*itr); } return *this; } List.hpp第二种写法—迭代器节点都嵌套到...const List& operator=(const List& L); //迭代器中转换构造是在beginend函数里面使用 //开始迭代器---返回迭代器已经可以间接操作

    98410

    STL之关联式容器map(二)

    emplace_hint() 返回不是一个 pair 对象,如果新元素被插入,它返回是指向新元素迭代器;如果没有插入,返回这个键匹配现有元素迭代器。...当 catch 代码块中代码执行后,try 代码块中所有变量会被销毁,因此不再可以访问。 元素默认构造函数会用键键所关联对象生成一个新元素,如果键关联对象是基本数据类型,它为 0。...当在函数体中通过名称使用右引用时,它会变成左,因此必须使用 move() //函数将它变为右,然后把它传给 vector 成员函数 push_back()。...}; #endif 如果没有定义 const 版 begin() end() 函数,就不能在 for 循环中使用 const 类型循环变量: for (const auto& pr :...如果想删除容器中所有元素,可以调用成员函数 clear()。

    56220

    学了C++不会STL,简直少了左膀右臂

    如:容器有成员beginend,其中begin成员复制返回指向第一个元素迭代器,而end成员返回指向容器尾元素下一个位置迭代器,也就是说end指示是第一个不合法地址,所以end返回是尾后迭代器...,等价于*a.begina[0] a.back() //返回最后一个元素,等价于*--a.end()a[size()-1] a.push_back(x)...比较函数只对元素key进行比较,元素各项数据只能通过key检索出来。虽然map与set采用都是红黑树结构,但跟set区别主要是set一个键值一个映射数据相等,Key=Value。...补充:捕获列表,是允许我们在Lambda表达式函数体中直接使用这些,捕获列表能捕获是所有在此作用域可以访问,包括这个作用域里面的临时变量,访问成员,全局变量。...除ab按引用进行传递外,其他参数都按进行传递。 9、&, a, b。除ab按进行传递外,其他参数都按引用进行传递。

    80720

    3分钟快速阅读-《Effective Java》(五)

    ,可变参数时一种很方便方式,但是不应该被过度滥用,参数列表不应该只有一个可变参数,避免调用方一个参数也不传导致程序出现问题.应该如下所示,用一个固定参数来进行区分 错误做法 public...其实我觉得如果每个方法都能非常规范把局部变量声明写在最前面,这样也是方便方法阅读.但是如果想要真正提高一个方法可读性,就需要我们把方法设计小而集中,这才是解决问题本质做法 46...过滤:需要在集合当中删除选定元素 转换:需要取代集合当中某个元素 平行迭代:需要并行遍历多个集合,需要显示控制迭代器或者索引变量,一遍所有迭代器或者索引变量都可以得到同步前移 47.了解使用库...引用原文:不要重新发明轮子,如果你要做事情看起来是十分常见 Java发展至今正常可能遇到需求工具,不要着急自己写一个,首先先找Java自带util包下看看有没有,如果没有就到谷歌common.lang3.../0ms } 49.2 装箱基本类型基本数据类型混合使用时候,JVM编译器自动拆装箱容易导致空指针异常,所以使用时记得类型一致性保证 49.3 装箱基本类型使用==比较结果是比较两者在堆空间地址

    43720

    框架设计原则规范(完)

    模式主要元素 a) Begin方法,用来开始一个异步操作 b) End方法,用来完成一个异步操作 c) 返回自Begin方法IAsyncResult对象,它本质上表示一个异步操作。...要确保begin方法返回类型实现了IAsyncResult接口 iii. 要确保同步方法传递引用传递参数在Begin方法中都是按传递 iv....要确保End方法返回类型同步方法返回类型相同 v. 如果Begin方法抛出异常,不要继续执行异步操作 vi....如果用户用同一个IAsyncResult两次调用一个End方法,或IAsyncResult是从另外一个不想管Begin方法返回,考虑抛出InvalidOperationException异常 x....这种是把非托管资源封装成托管资源做法。性能不高 A. 避免定义终结 B. 不要定义终结类型 C.

    98240

    疯子算法总结(三) STL Ⅱ迭代器(iterator) + 容器

    如:容器有成员beginend,其中begin成员复制返回指向第一个元素迭代器,而end成员返回指向容器尾元素下一个位置迭代器,也就是说end指示是第一个不合法地址,所以end返回是尾后迭代器...常见迭代器类型如下: 所有迭代器 操作 p++ 后置自增迭代器 ++p 前置自增迭代器 输入迭代器 操作介绍 *p 复引用迭代器,作为右 p=p1 将一个迭代器赋给另一个迭代器(迭代器指向地址) p...,等价于*a.begina[0] a.back() //返回最后一个元素,等价于*--a.end()a[size()-1] a.push_back(x)...比较函数只对元素key进行比较,元素各项数据只能通过key检索出来。虽然map与set采用都是红黑树结构,但跟set区别主要是set一个键值一个映射数据相等,Key=Value。...定义 list 名称 成员函数 l.begin() 将迭代器返回到开头(Return iterator to beginning) l.end() 将迭代器返回到最后(Return iterator

    79320

    【UVM COOKBOOK】UVM基础【二】

    agent是testbench上最低级层次结构块,其确切结构取决于其配置,每个agent配置(config object)可能因test而异。这些接口共同构成一个移植重用agent。...field_name是给资源名称。 value是放入数据库实际引用。...field_name是给资源名称。 value保存从数据库检索到实际引用;如果检索成功,get()调用返回1,否则返回0来表示数据库中不存在这种类型且具有这种作用域名称资源。...使用get()调用返回来检查是否获取失败,并给出有用错误消息。...要在作用域内使用package,必须导入,然后才能引用package内容。 SystemVerilog package是组织代码以及确保对类型、引用一致有用方法。

    1.6K30

    【C++】STL——反向迭代器模拟实现:迭代器适配器

    引用怎么不是返回当前结点啊,为什么返回是- 1之后再解引用? 那按照我们上面的分析理解,除了++- -这些操作之外,其它引用,判断相等不相等这些是不是可以不用动啊。...那这时候我们就要去看它里面的实现了,我们回到stl_list.h看到它rbeginrend是这样: rbegin 是end位置, rend 是begin位置,我们拿beginend来对比一下...rbegin解引用是不是拿到是最后一个元素。...然后我们实现一下解引用*: 那我们这里按库里面走,经过上面我们分析我们知道这里解引用返回是- -之后。 这样做。..._head); } list(const list& l) { empty_initialize(); list tmp(l.begin(), l.end());

    17410

    C++11『右引用 ‖ 完美转发 ‖ 新增功能 ‖ 可变参数模板』

    C++11发布标志着C++语言现代化进步,为程序员提供了更多工具选项来编写高效、维护现代代码 ️正文 1.右引用引用 是 C++11 重大更新之一,它出现很好解决了 临时资源浪费...问题,同时也给 对象 做了一个全面升级,使其能轻松规避很多低效拷贝问题 1.1.什么是右引用?...左引用、const 左引用 编译器这么做合理?...右 函数重载了 右引用 版本 3.1.移动构造移动赋值 之前中有六个天选之子:构造函数、析构函数、拷贝构造、赋值重载、取地址重载 const 取地址重载 有了 右引用 + 移动语义 后...总结 以上就是本次关于 C++11 中右引用移动语义相关知识了,右引用引入解决了临时资源过度消耗问题,为添加了移动语义函数,同时也升级了插入函数以支持右引用版本。

    48550

    C++:Vector模拟实现

    比如这个地方我们传string迭代器  传vector迭代器  2.1.3 有参构造函数(对n个存储类型去调用他们构造) //有参构造函数(对n个存储类型去调用他们构造) vector(...2.const T&val=T()  T()不是用一次就析构,为什么可以用引用 答:T()是一个用一次就析构匿名对象,其实本质上是因为他没有名字,用T引用val可以充当他名字,此时用val就相当于用这个匿名对象...,c11后是支持直接在成员变量那边给缺省,所以们可以美化一下 全部代码 //无参构造函数 vector() {} //有参构造函数(对n个存储类型去调用他们构造) vector...2.3.1.insert失效 就是因为扩容导致pos失效,我们需要去及时更新pos       但是我们传pos是传递,所以我们更新后pos更新,我们在后面解引用pos就会出现经典引用野指针问题... Self;//Ref单纯是为了控制解引用时候是否可以被写 //利用反向迭代器来封装正向迭代器,同时在里面设置反向迭代器行为 ReverseIterator

    9210

    Lambda表达式用法超详细整理!!!

    lambda调用方式与普通函数调用方式相同,都是使用调用运算符: cout<<f()<<endl;//打印42 在lambda中忽略括号参数列表等价于指定一个空参数列表。...除ab按引用进行传递外,其他参数都按进行传递。 9、&, a, b。除ab按进行传递外,其他参数都按引用进行传递。...在lambda表达式产生中含有一个重载函数调用运算符。...是因为由lambda产生函数调用运算符是一个const成员函数。如果lambda被声明为可变,则调用运算符就不是const了。...因此,编译器可以直接使用该引用而无需在lambda产生中将其存储为数据成员。 相反,通过捕获变量被拷贝到lambda中。

    78830

    容器适配器之stack,queue优先级队列---基于List实现链栈,链队列,优先级队列

    return item; } 链表.hpp 我们这里把独立迭代器节点都放入链表中,方便统一参数T使用 #pragma once #include #include<iostream...{ //先初始化 init(); //再调用赋值运算符重载 operator=(l); } //赋值运算符重载...const List& operator=(const List& L); //迭代器中转换构造是在beginend函数里面使用 //开始迭代器---返回迭代器已经可以间接操作...front() { return *Begin(); } const T& front() const { return *Begin(); } //返回尾元素引用---我们在迭代器函数里面重载了...*,因此解引用迭代器返回是当前迭代器current指针指向data数据域 //但注意返回应该是end迭代器前一个,即最后一个位置有效元素 //这里迭代器重载了--运算符,因此迭代器

    49020

    【C++修炼之路】11. list

    然而,对于实际来说,通过将list赋值给vector之后调用算法库sort时间还是要比只接归并排序快,因此在这里排序还是推荐拷贝到vector后调用算法库排序。...迭代器是内嵌类型(内部类或定义在里) 2.3 迭代器模拟实现 对于list结构,已经提到过是双向带头循环链表,而对于迭代器beginend又是左闭右开区间,因此模拟实现时begin在_head-..._pnode; } }; 但意是,->返回仍然是一个指针,那我们调用时确是一个函数:那返回时不应该是it->->_row?...,防止交换后tmp野指针不能正常调用析构 list tmp(lt.begin(), lt.end()); swap(tmp); } //lt3 = lt list...: 名等价于类型 模板: 名不等于类型 举例:list模板名为list,但是实际上类型是list,这两个在具体函数返回还是有区别的,但是在模板里面可以直接用名来代替类型,不过不建议这么用

    29300

    Python入门 (二)

    return -t[1] L2 = sorted(L, key=by_score) print(L2) 1.5 返回函数  高阶函数除了可以接受函数作为参数外,还可以把函数作为结果返回,相关参数变量都保存在返回函数中...作用域: 正常函数变量名是公开(public),可以被直接引用,比如:abc,x123,PI等; __xxx__ 是特殊变量,可以被直接引用,但是有特殊用途,例如__author__,__name...__,以及模块文档注释__doc__; _xxx__xxx这样函数或变量是非公开(private),不应该被直接引用,比如_abc,__abc等; 安装第三方模块: 知道模块名称后,可用以下命令进行安装...多态:调用方只管调用,不管细节,而当我们新增一种Animal子类时,只要确保方法run()方法编写正确,不用管原来代码是如何调用,运行时会自动调用相应方法。...四 面向对象高级编程 4.1 __slots__ 创建实例后,动态实例绑定任何属性方法。

    72520
    领券