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

时间:2018-06-25 03:37:32

标签: c++ performance vector c++17

考虑到vector指向类对象的指针,在现代C ++中更改对象的成员数据的“首选”(最有效/性能/简洁)方法是什么?当然,我可以使用for循环遍历vector,但是将for_each与lambda表达式一起使用会更好吗?还有其他更好的方法吗?

作为示例,假设我们有一个vector<Person*> successfulPeople类的Person类,其中包含两个成员变量bool isHappyisRich,它们需要从{{1 }}到false中的true中所有Person对象。

2 个答案:

答案 0 :(得分:3)

从技术上讲,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循环,there is no standard attribute that specifies parallel/otherwise non-sequential loop execution,但对于lang语,例如provides pragmas to optimize loops

因此,尽管当前的标准建议for_each可以(可能)执行得更好,但当前的现实选择实际上是for的{​​{1}}循环。 :-\

答案 1 :(得分:1)

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