我对 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?
我确实知道它可能不是最好的结构,我应该使用其他一些数据结构来做这种事情,但我只想了解这是否可以或者是否可能导致一些未定义的行为。
我是有限元计算软件的开发人员。
我们使用这种技术来访问元素内的值。它可以帮助我们节省大量内存
但是:请注意,它会破坏您的缓存位置。如果可以避免,请不要在重循环中使用它。
如果您需要一系列的检查和性能并不重要,你可以考虑使用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)
这是完全正确的。
但实际上,您只想迭代标准容器的元素。C++ 允许针对该用例使用基于范围的 for 语句:
for (index: a2) {
a1[index] += 5000;
}
Run Code Online (Sandbox Code Playgroud)
我发现它更具可读性,即使它主要是一个品味问题......
免责声明:此代码无法控制 的a2as 索引元素的有效性a1。
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |