考虑到vector
指向类对象的指针,在现代C ++中更改对象的成员数据的“首选”(最有效/性能/简洁)方法是什么?当然,我可以使用for
循环遍历vector
,但是将for_each
与lambda表达式一起使用会更好吗?还有其他更好的方法吗?
作为示例,假设我们有一个vector<Person*> successfulPeople
类的Person
类,其中包含两个成员变量bool isHappy
和isRich
,它们需要从{{1 }}到false
中的true
中所有Person
对象。
答案 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 )。当然,即使复杂度相同,但根据数据结构的存储方式(即,在连续内存中),速度也会有所不同。