vector at()和下标访问哪个好?

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

vector 是可以直接用下标进行访问的一类容器

vector <int> A;
A.push_back(1);
cout<<A[0];

输出:1


但是,有些资料上说vector 最好用at() 进行访问,这是为什么呢?

这是因为at()有对元素是否越界进行判断,如果越界,马上抛出异常 out_of_range
(但是,这个异常是跟踪进去调试的时候才会出现的)
在这里插入图片描述
如果在执行的时候报错的话是这样的:在这里插入图片描述
很“ 蛋疼 ”,这个信息什么意思??一头雾水。。。。。。

下面再看看下标访问越界的情况,看下图:
在这里插入图片描述
很明确的告诉我们vector 越界了!这个报错多友好呐~

不过用下标访问确实也有不好的地方,下面给出解释:
如果用下标访问的话,它是不会检查是否越界的,一路莽下去,直到出错了才停止(当初我试着跟踪进去,走了几分钟都还没报错,而at()很快就报错了)。
在这里,不进行检查是为了提高 vector 容器的效率。

在 vec 非空的情况下,即使下标越界,也有可能对应的内存是可读写的,至于读到的是什么内容,或者写到什么地方,就是随机事件了。

上文引用于:https://blog.csdn.net/luansxx/article/details/10194171
(后来查到的资料,恍然大悟为什么我能跟踪进去那么久)呜~~~~(>_<)~~~~

综上:我还是觉得在写代码的时候还是可以继续用下标访问,因为比较好知道出错的原因。

个人拙见,如果有错,感谢指出。

STLSTL容器vector at函数 [ ]运算符 介绍 返回v指定位置n的元素。at函数比[]运算符更加安全, 因为它不会让你去访问到越界的元素,一旦越界将会在运行时中止程序并抛出一个异常std::out_of_range。 使用 用at函数,越界会有异常,但是用[],越界了正常输出 #include <iostream> #include <string> #include <unordered_map> #include <vector> using namespace std; int ma 阅读详情

相关推荐

C++ vector unordered_map速度对比(含迭代器)

C++ vector unordered_map速度对比(含迭代器) 下面这段程序是我进行的一个对比实验,数组的维数是3000,重复500000次,统计总耗时(使用Release模式,开启O2优化)。 #include<iostream> #include<vector> #include<ctime> #include<unordered_set> #pragma GCC optimize(2) using namespace std; int main

weixin_43993619的博客 1845

访问vector元素方法的效率比较

比较访问vector元素的两种方式: 一、使用下标访问; 二、使用迭代器(类似指针)访问。 代码: #include&lt;iostream&gt; #include&lt;vector&gt; #include&lt;windows.h&gt; using namespace std; int main(){ vector&lt;int&gt; vec; vec.res...

Curtis’Blog 2646

[C++] 关于operator[]()at()

在接触到STL时,我发现大部分容器都有两个成员函数:operator[]()at()。乍一看,这实现的不就是同一种功能,为什么要存在两个函数?我们去www.cplucplus.com看一看。 &lt;array&gt; array &lt;deque&gt; deque &lt;forward_list&gt; forward_list &lt;list...

qq_37474728的博客 1万+

C++基础知识(七) vector使用方法,at()用法

Vector成员函数 函数 表述 c.assign(beg,end) 将[beg; end)区间中的数据赋值给c。 c.assign(n,elem) 将n个elem的拷贝赋值给c。 c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。 c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器...

ljsr123的博客 2万+

C++ STL语法:Vectorat( )函数的用法

C++ STL语法:Vectorat( )函数的用法

懒人一个 1412

vector的动态扩容机制与下标越界问题

的自动扩容机制并不能防止数组下标越界的问题,需要防止下标越界可以用at()访问vector元素。即使可以自动扩容,但是访问的元素还是需要确保下标在有效范围内,否则仍然会导致未定义行为。如果访问了中没有初始化的下标,那么可能会遇到任何数值,这是未定义的行为。在C++中,未定义的行为可能会导致程序崩溃,也可能会静默地继续运行,但产生错误的结果。

CFY1226的博客 3349

vector访问与赋值

1、vector元素的访问访问可以用下标访问,只要不越界,都是有效数据 #include<iostream> #include<vector> using namespace std; int main(){ vector<int> a; a.push_back(10); cout<<a[0]; return 0; ...

Curtis’Blog 2959

STL vector中的at方法

std::vector::at reference at (size_type n); const_reference at (size_type n) const; Access element Returns a reference to the element at positionnin thevector. 返回一个指向位置n的元素的引用。 The func...

zpznba的博客 2973

c++,vector的[]at区别

std::vector<int> a; std::cout<<a.size();上面输出是0.容器初始化什么都不做,大小为0; std::vector<int> a; // std::cout<<a.size(); a[0]=1; a.at(0)=1;下标[]赋值会显示SIGSEGV段错误,越界错误. at赋值会显示 terminate called after

yxccc的博客 1万+

C++数组、vector求最大值最小值及其下标

C++数组、vector求最大值最小值下标 可以用max_element()及min_element()函数,二者返回的都是迭代器或指针。 头文件: #include<algorithm> 一.求数组的最大值或最小值 1、vector容器vector<int> vec 最大值: int maxValue = *max_element(v.b...

风暴中心 3万+

C++ STL vector容器访问元素的几种方式

C++ STL vector容器访问元素的几种方式 < C++ STL vector容器迭代器的用法C++ vector容量(capacity)大小(size)的区别 > 首先,vector 容器可以向普通数组那样访问存储的元素,甚至对指定下标处的元素进行修改,比如: #include <iostream> #include <vector> using namespace std; int main() { vector<int> values

南宫萧幕的博客 1万+

什么时候应该用C++ vector的.at()[ ]?(优缺点越界访问时二者的区别)

最主要的区别就是.at()会额外检查访问是否越界,如果越界,会抛出exception,所以使用.at()时程序运行速度较慢。 二者优点 一般来说用[]效率更高,尤其是需要对索引值进行复杂的计算或者单纯不需要检查是否越界时。 更好的做法是默认用.at(),这样代码尽管很慢但不会产生bug;[]更适合对程序效率要求比较高的场景。 []缺点 索引值越界时程序不会报错,但会一路莽下去,在向量非空的情况下,即使下标越界,也有可能对应的内存是可读写的,至于读到的是什么内容,或者写到什么地方,就是随机事.

shuoO-24的空间站 6359

vector 遍历及下标访问

vector 常规的遍历方法有三种: 1.for 遍历 vector theVector; ... vector::iterator theIterator; for (theIterator = theVector.begin(); theIterator != theVector.end(); theIterator++) { cout << *theIterato

1万+

Vector用数组下标访问的条件

vector实现数组访问的条件通过两段代码测试,我们得出原则就是数组下标[]访问,前提就是这样的元素是存在的,就可以使用这样的访问形式,vector容器是重载了数组的访问形式。这一点程序员务必要小心,因为些这样的程序是编译通过的,但是运行的时候内存就会报错! #include <vector> #include <iostream> using namespace std;int main() {

Touch_Dream的博客 9808

vector下标索引与at的区别

v.at(5) //v[5] 如果vector v非空,那么at下标索引没有区别。如果v为空,调用at会抛出异常,而operator[]索引的行为未定义。 c++标准不要求operator[]进行下标越界检查,原因是为了效率,下标越界检查会增加程序的性能开销。

heroesjun的博客 3661

C++实战篇】c++ vector 赋值 只能用push_back()赋值 ?使用下标赋值出错,不能使用标赋值吗?

本文介绍了C++vector容器的多种赋值方法。重点对比了push_back()下标赋值的区别:默认初始化的空vector只能使用push_back()动态添加元素,而下标赋值要求预先分配内存空间。文章详细分析了两种赋值方式的使用场景错误原因,并通过示例代码展示了二者的差异。此外,还总结了vector的其他初始化赋值方式,包括初始化列表、构造函数、拷贝构造、直接赋值、迭代器赋值、移动赋值等,并提供了各种赋值方法的具体代码实现。最后介绍了使用swap数组地址初始化vector的技巧。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 3082

vector返回最值及其下标

void test01() { vector<int> v; for(int i=0; i<5; i++){ for(int j=i; j<5; j++) { v.push_back(i+j); } } for(vector<int>::iterator it=v.begin();it!=v.end();it++) { ...

AI__future的博客 1799

C++ STL中使用指针语法访问vector中的元素

C++ STL中使用指针语法访问vector中的元素

qq_41317716的博客 953

c++ 使用 at()访问数组 抛出异常

区别在于,operator[]不做边界检查, 哪怕越界了也会返回一个引用,当然这个引用是错误的引用,如何不小心调用了这个引用对象的方法,会直接导致应用退出。而由于at会做边界检查,如果越界,会抛出异常,应用可以try catch这个异常,应用还能继续运行。当我们定义一个数组vector b(10)后,b[]b.at()都可以对v中元素进行访问,平时一般大家使用的都是v[]这种访问方法,以至于将v.at()这种访问方式忘记了。str[] 不会检查下标越界,不会抛出异常,所以即使有错误,try 也检测不到。

阿乐的博客 1346
上一篇: 最小公倍数C++
下一篇: vector 的内存分配问题
Free Jim
博客等级 码龄8年 106粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值