C++17中将三个std::vector拷贝合并为临时单个vector的最简方法
有更简洁且性能更优的实现方式,核心可以借助标准库的std::copy接口配合std::back_inserter替代手写循环,还可以通过预分配内存减少扩容开销,完全满足不修改原vector、仅拷贝内容合并的需求。
方案1:统一处理逻辑(易维护,性能最优)
将所有待合并的源容器汇总后统一判断、计算大小、拷贝,避免重复代码,后续新增待合并容器时只需修改一处:
#include <algorithm> // 引入std::copy #include <iterator> // 引入std::back_inserter // ... 你的其他业务代码 std::vector<COleDateTime> vecAssignmentDate; // 汇总所有待查找的源map,后续新增合并源只需在此添加即可 const auto sourceMaps = { &m_mapHist[m_eHistAssign], &m_mapScheduleHist[m_eHistAssign], &m_mapScheduleFutureHist[m_eHistAssign] }; // 第一步:预计算总元素数,提前申请内存,避免多次拷贝扩容带来的性能损耗 std::size_t totalSize = 0; for (const auto& map : sourceMaps) { auto iter = map->find(strName); if (iter != map->end()) { totalSize += iter->second.size(); } } vecAssignmentDate.reserve(totalSize); // 第二步:批量拷贝所有存在的vector内容到目标容器 for (const auto& map : sourceMaps) { auto iter = map->find(strName); if (iter != map->end()) { std::copy(iter->second.begin(), iter->second.end(), std::back_inserter(vecAssignmentDate)); } }
方案2:极简写法(适合固定合并数量场景)
借助C++17的if初始化语句,代码更简洁,迭代器作用域也更干净:
#include <algorithm> #include <iterator> std::vector<COleDateTime> vecAssignmentDate; if (auto it = m_mapHist[m_eHistAssign].find(strName); it != m_mapHist[m_eHistAssign].end()) { std::copy(it->second.begin(), it->second.end(), std::back_inserter(vecAssignmentDate)); } if (auto it = m_mapScheduleHist[m_eHistAssign].find(strName); it != m_mapScheduleHist[m_eHistAssign].end()) { std::copy(it->second.begin(), it->second.end(), std::back_inserter(vecAssignmentDate)); } if (auto it = m_mapScheduleFutureHist[m_eHistAssign].find(strName); it != m_mapScheduleFutureHist[m_eHistAssign].end()) { std::copy(it->second.begin(), it->second.end(), std::back_inserter(vecAssignmentDate)); }
两种方案都不会修改原有的三个vector,所有内容均为拷贝生成,符合你的使用要求。
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

