如何将两个const std::vector合并为新的const std::vector?
合并两个const std::vector为新const std::vector的实现方法
由于目标vector是const类型,无法先创建空对象再追加元素,必须在初始化阶段完成合并操作,以下是几种可行方案:
方法1:自定义辅助函数合并
编写一个模板函数,接收两个const vector并返回合并后的vector,直接用该返回值初始化目标const vector:
#include <iostream> #include <vector> template <typename T> std::vector<T> merge(const std::vector<T>& vec1, const std::vector<T>& vec2) { std::vector<T> merged; merged.reserve(vec1.size() + vec2.size()); // 预分配空间,避免多次扩容 merged.insert(merged.end(), vec1.begin(), vec1.end()); merged.insert(merged.end(), vec2.begin(), vec2.end()); return merged; } int main() { const std::vector<int> int_a{0,1}; const std::vector<int> int_b{2,3}; const std::vector<int> all_ints = merge(int_a, int_b); for (int i: all_ints) std::cout << i << ' '; // 输出:0 1 2 3 return 0; }
方法2:用Lambda表达式原地生成
无需额外定义函数,直接用lambda在初始化时生成合并后的临时vector:
#include <iostream> #include <vector> int main() { const std::vector<int> int_a{0,1}; const std::vector<int> int_b{2,3}; const std::vector<int> all_ints = [&]() { std::vector<int> temp; temp.reserve(int_a.size() + int_b.size()); temp.insert(temp.end(), int_a.begin(), int_a.end()); temp.insert(temp.end(), int_b.begin(), int_b.end()); return temp; }(); // 立即执行lambda for (int i: all_ints) std::cout << i << ' '; // 输出:0 1 2 3 return 0; }
方法3:C++20及以上使用范围库拼接
利用C++20的std::ranges::concat_view拼接两个范围,再用其初始化vector:
#include <iostream> #include <vector> #include <ranges> int main() { const std::vector<int> int_a{0,1}; const std::vector<int> int_b{2,3}; const auto concat_view = std::ranges::concat(int_a, int_b); const std::vector<int> all_ints(concat_view.begin(), concat_view.end()); for (int i: all_ints) std::cout << i << ' '; // 输出:0 1 2 3 return 0; }
如果使用C++23,还可以用更简洁的std::ranges::to适配器直接转换:
const std::vector<int> all_ints = std::ranges::concat(int_a, int_b) | std::ranges::to<std::vector<int>>();
内容的提问来源于stack exchange,提问作者Manumerous
相关产品推荐
相关产品推荐

