如何高效更改向量中所有对象的成员数据?
How to efficiently change member data of all objects in a vector?
给定指向类对象的指针vector
,在现代C++中更改对象成员数据的"首选"(最有效/最高效/最简洁(的方法是什么?当然,我可以使用for
循环来迭代vector
,但是将for_each
与lambda表达式一起使用会是更好的选择吗?还有其他更好的方法吗?
例如,假设我们vector<Person*> successfulPeople
了包含两个成员变量布尔值的Person
类,isHappy
和isRich
需要为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
可以(可能(表现得更好,但当前现实的选择实际上是一个具有pragma
s的for
循环。
没有。for
循环和for each
只是做同样的事情,但语法不同。如果你只是在容器中搜索一个元素,其他数据结构(如二叉树(可能会更有效,但无论哪个容器,只要你需要遍历整个数据结构,复杂性将是O(n(。当然,即使复杂性相同,根据数据结构的存储方式(即在连续内存中(,速度也会有所不同。
相关文章:
- 指向设备对象成员的指针
- 访问由unique_ptr传递的对象成员
- 引用对象成员函数的成员函数
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- Lua C API - 从C++分配和使用类的对象成员
- Rapidjson 遍历并获取复杂 JSON 对象成员的值
- 类对象成员变量在调用函数时不会更改
- 对象成员变量还是继承
- C++多态性:有没有办法找到对象成员函数的地址?
- 重载对象成员的比较运算符
- 获取未初始化对象成员的地址是否定义良好?
- 在优先级队列被推送到队列后,如何编辑对象成员
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 通过 std::bind 从对象成员检索值
- 保留对象成员变量的本地副本
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 没有默认构造函数的对象成员的 wig setter
- 对象成员数组C++默认初始化
- 如何在数组中添加对象成员
- 使用聚合创建和关联两个不同的对象成员