【问题标题】:Should .at() be used over [] in std::vector or std::array? [closed].at() 是否应该在 std::vector 或 std::array 中的 [] 上使用? [关闭]
【发布时间】:2019-03-28 18:42:36
【问题描述】:

这与this post 相关,std::vector 中谈到了 .at() 与 []。我只想问是否应该在括号运算符上使用.at()?以如下代码为例:

#include <vector>
#include <iostream>

void print(const std::vector<int> &v)
{
  for(int i = 0; i < v.size(); ++i)
  {
    std::cout << v.at(i) << " ";
  }
  std::cout << std::endl;
}

int main()
{
  std::vector<int> test = {1,2,3,4};
  print(test);
}

我不会以这种方式打印向量,我会使用for(const auto &amp;e : v) 并打印出每个元素,因为这保证不会超出向量的范围。但是,假设我们正在向新生教授 for 循环。

假设我们将 for 循环中的第二个参数更改为 v.size() + 1.at(i) 将崩溃并给我们一个有意义的运行时错误std::out_of_range。但是,如果我们将.at(i) 更改为v[i],程序运行良好并为我打印出一个额外的数字。我在 Window 上的 Ubuntu 18.04 上运行它,我认为当我这样做时程序会崩溃,但事实并非如此。

那么问题来了,我们是否应该在访问容器时使用.at() 而不是[]

【问题讨论】:

  • 但是,让我们先说一下我们正在教新学生有关 for 循环的知识。 从基于范围的 for 循环开始他们,并在他们更舒服时将旧循环留到以后。
  • 您自己提供的链接中究竟有什么不清楚的地方?我不知道如何在已经那里添加任何内容。
  • @Sailanarmo 在我们生活的方方面面(包括软件开发)中,始终以安全为代价换取可用性。投资时,你想要更低的风险还是更高的回报?
  • @DrPhil 我的意见是,如果性能对你来说并不重要,你可能应该使用不同的语言。

标签: c++ c++11 vector containers


【解决方案1】:

应该在 std::vector 或 std::array 中的 [] 上使用 .at() 吗?

是的,如果

  • 您无法证明您访问的索引在界限内。
  • 您不想费心去证明这一点。
  • 您可能在证明或实现中犯了错误(对于人类来说,大多数情况下这是“是”),并且程序中未定义的行为比at 的开销更昂贵。

不,如果

  • 您负担不起at 的开销。

没关系,如果

  • 您的程序不用于未定义行为可能导致信息丢失(或泄露)、任何有货币价值的东西、生命等的情况。

假设我们正在教新学生

使用at 对于推理程序正确性的能力尚未发展的新生特别有用。

另一方面,理解未定义的行为对于 C++ 程序员来说也是必不可少的,向量下标及其注意事项也需要介绍给学生……在他们已经熟悉向量的稍后时间。

【讨论】:

  • 大多数标准库都有调试级别来进行额外的调试检查
  • 为什么不使用assert,如果有bug就修复?
  • @manlio 因为 1. assert 不能像处理异常一样优雅地处理,因为 2. 断言通常在发布模式下被禁用,大多数人没有时间或能力进行测试100% 的可能用例。
猜你喜欢
  • 2016-02-12
  • 2020-05-21
  • 2012-12-08
  • 2011-05-24
  • 2023-02-09
  • 1970-01-01
  • 2020-08-20
  • 2017-04-17
  • 2014-08-20
相关资源
最近更新 更多