合并多个均匀大小的向量
Merge multiple evensized vectors
我有 n 个偶数大小的 std::vector
。让我们假设 n=3 和 size = 4:
std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
std::vector<std::vector<int>> combinedVectors {a,b,c};
我想检索一个大小为 4 的向量,它的第 i
个成员是所有向量第 i
个成员的总和。
在例子中
std::vector<int> x{6,7,8,9};
构建向量的最佳通用方法是什么 x
?请在您的回答中坚持使用 cpp17 标准。
通过最好的方式,我想坚持使用 <algorithm>
而不是使用循环。
如果你真的确定要使用algorithm
库,你可以这样:
std::vector<int> tmp;
std::vector<int> result;
std::transform(
std::begin(a), std::end(a),
std::begin(b),
std::back_inserter(tmp),
[](int a, int b) { return a + b; }
);
std::transform(
std::begin(c), std::end(c),
std::begin(tmp),
std::back_inserter(result),
[](int a, int b) { return a + b; }
);
缺点是您需要一个临时的 std::vector
。
不存在将一系列范围作为参数的算法(好吧,它们确实如此,但马虎地说算法适用于元素而不是元素的元素)。 std::ranges
可能会有所帮助,但如果您想坚持使用 C++17,则只能使用现有算法并进行一些扭曲或编写您自己的算法。
#include <vector>
#include <iostream>
template <typename IT,typename...Args>
void copy_sum(IT begin, IT end, IT to, Args... others) {
for (; begin != end; ++begin,++to){
*to = *begin + (*others++ + ...);
}
}
int main(){
std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
//std::vector<std::vector<int>> combinedVectors {a,b,c};
std::vector<int> result(a.size());
copy_sum(a.begin(),a.end(),result.begin(),b.begin(),c.begin());
for (auto e : result) std::cout << e << " ";
}
请注意,我没有使用 combinedVectors
。如果你想保持通用,那么传递迭代器而不是容器。尽管如此,上面的内容可以从一个帮助器中受益,该帮助器将 begin
和 end
带到 combinedVectors
中的一系列元素并将它们的 begin
和 end
转发到 copy_sum
.
然而,这并不是我所说的 "nicest",只要您继续使用 C++17,一个简单的循环在可读性方面可能是无与伦比的。
我有 n 个偶数大小的 std::vector
。让我们假设 n=3 和 size = 4:
std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
std::vector<std::vector<int>> combinedVectors {a,b,c};
我想检索一个大小为 4 的向量,它的第 i
个成员是所有向量第 i
个成员的总和。
在例子中
std::vector<int> x{6,7,8,9};
构建向量的最佳通用方法是什么 x
?请在您的回答中坚持使用 cpp17 标准。
通过最好的方式,我想坚持使用 <algorithm>
而不是使用循环。
如果你真的确定要使用algorithm
库,你可以这样:
std::vector<int> tmp;
std::vector<int> result;
std::transform(
std::begin(a), std::end(a),
std::begin(b),
std::back_inserter(tmp),
[](int a, int b) { return a + b; }
);
std::transform(
std::begin(c), std::end(c),
std::begin(tmp),
std::back_inserter(result),
[](int a, int b) { return a + b; }
);
缺点是您需要一个临时的 std::vector
。
不存在将一系列范围作为参数的算法(好吧,它们确实如此,但马虎地说算法适用于元素而不是元素的元素)。 std::ranges
可能会有所帮助,但如果您想坚持使用 C++17,则只能使用现有算法并进行一些扭曲或编写您自己的算法。
#include <vector>
#include <iostream>
template <typename IT,typename...Args>
void copy_sum(IT begin, IT end, IT to, Args... others) {
for (; begin != end; ++begin,++to){
*to = *begin + (*others++ + ...);
}
}
int main(){
std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
//std::vector<std::vector<int>> combinedVectors {a,b,c};
std::vector<int> result(a.size());
copy_sum(a.begin(),a.end(),result.begin(),b.begin(),c.begin());
for (auto e : result) std::cout << e << " ";
}
请注意,我没有使用 combinedVectors
。如果你想保持通用,那么传递迭代器而不是容器。尽管如此,上面的内容可以从一个帮助器中受益,该帮助器将 begin
和 end
带到 combinedVectors
中的一系列元素并将它们的 begin
和 end
转发到 copy_sum
.
然而,这并不是我所说的 "nicest",只要您继续使用 C++17,一个简单的循环在可读性方面可能是无与伦比的。