gpt4 book ai didi

c++ - 如何顺序地遍历两个容器

转载 作者:行者123 更新时间:2023-12-03 06:49:27 27 4
gpt4 key购买 nike

我有两个 vector 。我想遍历这两个元素的所有元素并做一些事情(比如将它们打印出来)。所以我可以这样写:

vector<int> vec_a{1, 2, 3}, vec_b{4, 5, 6, 7};

for (auto a : vec_a) {
cout << a;
}
for (auto b : vec_b) {
cout << b;
}
这有很多重复。我可以做类似的事情:
for (const auto& vec : {vec_a, vec_b}) {
for (auto elem : vec) {
cout << elem;
}
}
但这增加了一个额外的 for(虽然还不错,但我想知道是否还有更好的方法。类似以下内容:
for (auto elem : concat(vec_a, vec_b)) {
cout << elem;
}
我知道我可以只合并 vector (la Concatenating two std::vectors),但是语法甚至更笨拙(特别是因为我实际上有4个 vector )。
我希望输出为:

1 2 3 4 5 6 7

最佳答案

一个简单的解决方案是使用一个辅助函数:

#include <functional>

template <typename Func, typename... Containers>
void for_all(Func&& func, Containers&&... containers) {
auto iteration_func = [&](auto&& container) {
for (auto&& elem : std::forward<decltype(container)>(container)) {
std::invoke(func, std::forward<decltype(elem)>(elem));
}
};

(iteration_func(std::forward<Containers>(containers)), ...);
}
在这里,我们使用带有立即调用的lambda的 fold expression来模拟可变参数模板参数上的循环,其中每个参数均被循环,并在其元素上调用提供的函数对象。
使用 forwarding references和对 std::forward 的调用会保留参数和元素的值类别,以与rvalue范围兼容(例如range-v3库中的 move_view )。 std::invoke 将功能对象的概念推广到 pointers to members,这在某些情况下很有用。
例子:
int main() {
std::vector<int> vec_a{1, 2, 3};
std::vector<int> vec_b{4, 5, 6, 7};

for_all([](int n) {
std::cout << n << ' ';
}, vec_a, vec_b);

std::cout << '\n';
}
( wandbox)
可以混合使用不同的容器类型:
for_all([](const auto& n) {
std::cout << n << ' ';
}, std::vector{1, 2, 3}, std::list{"foo", "bar"});

关于c++ - 如何顺序地遍历两个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64372079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com