如何高效更改向量中所有对象的成员数据?

How to efficiently change member data of all objects in a vector?

本文关键字:对象 成员 数据 向量 何高效 高效      更新时间:2023-10-16

给定指向类对象的指针vector,在现代C++中更改对象成员数据的"首选"(最有效/最高效/最简洁(的方法是什么?当然,我可以使用for循环来迭代vector,但是将for_each与lambda表达式一起使用会是更好的选择吗?还有其他更好的方法吗?

例如,假设我们vector<Person*> successfulPeople了包含两个成员变量布尔值的Person类,isHappyisRich需要为successfulPeople中的所有Person对象从false更改为true

从技术上讲,for_each更可取,因为它允许指定其执行策略:

#include <algorithm>
#include <vector>
#include <execution>
int main() {
std::vector<int> v{0, 1, 2};
std::for_each(std::par_unseq, v.begin(), v.end(), [](int &x){ x += 40; });
}

实际上,如果您尝试编译上面的代码,当前的编译器将拒绝:

$ clang -v -std=c++17 meow.cpp |& gawk '/execution/ { on = 1 } on || NR == 1 { print }' | sed 's/^/    /'
clang version 6.0.0 (tags/RELEASE_600/final)
meow.cpp:5:10: fatal error: 'execution' file not found
#include <execution>
^~~~~~~~~~~
1 error generated.
$ g++ -v meow.cpp |& tail -9 | sed 's/^/    /'
GNU C++17 (GCC) version 8.1.1 20180531 (x86_64-pc-linux-gnu)
compiled by GNU C version 8.1.1 20180531, GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: c1584951f18917e503c3b4657c1f0dc5
meow.cpp:5:10: fatal error: execution: No such file or directory
#include <execution>
^~~~~~~~~~~
compilation terminated.

因为并行 TS 可能尚未在当前优先级列表中(尽管许多 C++20 功能是。

至于for循环,没有标准属性指定并行/非顺序循环执行,但 clang 例如提供编译指示来优化循环。

因此,尽管当前的标准表明for_each可以(可能(表现得更好,但当前现实的选择实际上是一个具有pragmas的for循环。

没有。for循环和for each只是做同样的事情,但语法不同。如果你只是在容器中搜索一个元素,其他数据结构(如二叉树(可能会更有效,但无论哪个容器,只要你需要遍历整个数据结构,复杂性将是O(n(。当然,即使复杂性相同,根据数据结构的存储方式(即在连续内存中(,速度也会有所不同。