首页 > 试题广场 >

T是一个数据类型,关于std::vector::at 和 s

[单选题]
T是一个数据类型,关于std::vector::at 和 std::vector::operator[] 描述正确的是:
  • at总是做边界检查, operator[] 不做边界检查.
  • at 不做边界检查, operator[] 做边界检查.
  • at和operator[] 是一样的
访问vector中的数据
使用两种方法来访问vector。
1、   vector::at()
2、   vector::operator[]
operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector<int> v;
v.reserve(10);
 
for(int i=0; i<7; i++)
    v.push_back(i);
 
try
{
 int iVal1 = v[7]; // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
 cout << e.what();
}
参考网址http://www.cnblogs.com/yxnchinahlj/archive/2011/03/06/1972435.html
发表于 2015-09-05 16:07:26 回复(3)
答案:选A
结论at()总是做边界检查,下标运算符(operator[] )不做边界检查。

解析(详情参看 《C++ Primer》(第5版) P310 ”下标操作和安全的随机访问“)
       提供快速随机访问的容器(如:string、vector、deque 和 array)也都提供下标运算符(operator [ ])。
       一、下标运算符接受一个下标参数,返回容器中该位置的元素的引用。给定下标必须保证”在范围内“(即,大于等于0,且小于容器的大小)。保证下标有效是程序员的责任,下标运算符并不检查下标是否在合法范围内。使用越界的下标是一种严重的程序设计错误,而且编译器并不检查这种错误。
       c[n]     :  返回c中下标为n的元素的引用,n是一个无符号整数。若n>=c.size(),则函数行为未定义。
       二、如果希望确保下标是合法的,可以使用at成员函数。at成员函数类似下标运算符,但如果下标越界,at会抛出一个out_of_range异常。
       c.at(n): 返回下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常。
如:
vector<string> sVec; // 空vector
cout << sVec[0];     // 运行时错误:sVec中没有元素!
cout << sVec.at(0);  // 抛出一个out_of_range异常

发表于 2016-12-11 14:56:35 回复(0)
一个技巧记忆方法,at没界,所以检查界;[]有界,就不检查了~
发表于 2021-03-29 09:51:25 回复(0)
见《C++Primer》P310:c[n]操作若n>=c.size(),则函数行为未定义; c.at(n)操作,如果下标越界,则抛出out_of_range异常
发表于 2016-04-28 14:22:09 回复(0)
结论:at()总是做边界检查,下标运算符(operator[] )不做边界检查
发表于 2023-10-20 15:54:04 回复(0)
我记得我选的是c啊,这啥啊

发表于 2022-09-05 20:08:18 回复(0)
vector的索引查询可通过at()和下标运算符[]来进行,at()做边界检查,[]不做边界检查
发表于 2018-03-12 09:13:24 回复(0)
at函数不是调用的
发表于 2017-07-20 19:07:10 回复(0)
只能说QT的[]是检查边界的。。。at不清楚。。。。不过题目应该问的是C++标准是如何规定的吧。。。
发表于 2017-07-14 12:10:29 回复(0)