对 std::vector 使用嵌套 [ ] 操作

dvd*_*280 1 c++ std stdvector

我对 C++ 很陌生,我曾尝试寻找这个问题的答案并运行测试,但很多时候我无法弄清楚是什么导致了特定行为。我的问题与使用嵌套[ ]运算符访问或修改循环中的元素有关 - 例如:

//Declare

std::vector<int> a1 {10,20,30,40} ;
std::vector<int> a2 {2,3} ;
int S2 = a2.size() ; 

//Loop
for(int i = 0 ; i < S2 ; i++){
         a1[a2[i]] = a1[a2[i]] + 5000 ;
}
Run Code Online (Sandbox Code Playgroud)

这被认为可以吗?我不仅要问一般做法,还要问效率和我需要考虑的任何其他潜在因素。我是否应该首先存储a[i]在循环内的临时变量中,然后使用它来修改 vector 中的元素a2

我确实知道它可能不是最好的结构,我应该使用其他一些数据结构来做这种事情,但我只想了解这是否可以或者是否可能导致一些未定义的行为。

sch*_*312 6

我是有限元计算软件的开发人员。

我们使用这种技术来访问元素内的值。它可以帮助我们节省大量内存

但是:请注意,它会破坏您的缓存位置。如果可以避免,请不要在重循环中使用它。

如果您需要一系列的检查和性能并不重要,你可以考虑使用at的运营商std::vector

 for(const auto & index :a2) {
      a1.at(index) += 5000;
 }
Run Code Online (Sandbox Code Playgroud)

at函数会自动检查 n 是否在向量中有效元素的范围内,如果不在则抛出 out_of_range 异常(即,如果 n 大于或等于其大小)。这与不检查边界的成员 operator[] 形成对比。

此外,考虑使用基于范围的循环

 //Loop
 for(const auto & index :a2) {
      a1[index] += 5000;
 }
Run Code Online (Sandbox Code Playgroud)


Ser*_*sta 5

这是完全正确的。

但实际上,您只想迭代标准容器的元素。C++ 允许针对该用例使用基于范围的 for 语句

for (index: a2) {
    a1[index] += 5000;
}
Run Code Online (Sandbox Code Playgroud)

我发现它更具可读性,即使它主要是一个品味问题......

免责声明:此代码无法控制 的a2as 索引元素的有效性a1

  • @dvd280编译器将使用传统的for循环来实现基于范围的for循环。这意味着您的代码和 Serge 的代码将编译为相同的二进制文件,其执行方式相同。 (2认同)