能否仅为std::pair插入单个值?向量分循环填充优化方案咨询
针对std::pair分阶段填充的解决方案
如果你需要在不同循环中分别填充std::pair的两个成员,且不想使用硬编码的占位值(比如0),可以参考以下几种实用方案:
方案一:默认构造pair后逐个赋值
这是最直接的方式,先通过默认构造创建空的pair,再在后续循环中分别赋值两个成员。要求typeA和typeB支持默认构造:
std::vector<std::pair<typeA, typeB>> ports; // 第一阶段填充first成员 ports.emplace_back(); // 默认构造pair,成员为各自类型的默认值 ports.back().first = actual_value; // 第二阶段填充指定位置的second成员 ports[i].second = target_value;
方案二:用类型默认构造替代占位值
如果typeB支持默认构造,比起用0这种可能不符合类型语义的占位值,直接使用typeB{}构造默认值更合理,后续再更新为实际值:
std::vector<std::pair<typeA, typeB>> ports; // 第一阶段插入first,second用类型默认构造 ports.emplace_back(actual_value, typeB{}); // 第二阶段更新second成员 ports[i].second = target_value;
方案三:分存数据后批量合并
如果你的填充逻辑是先收集完所有first值,再收集完所有second值,可以先分别存储两个列表,最后一次性合并成std::pair的vector,完全避免中间占位:
std::vector<typeA> first_list; std::vector<typeB> second_list; // 第一循环收集所有first值 first_list.push_back(actual_value); // 第二循环收集所有second值 second_list.push_back(target_value); // 合并为pair的vector(提前reserve避免内存多次分配) std::vector<std::pair<typeA, typeB>> ports; ports.reserve(first_list.size()); for (size_t i = 0; i < first_list.size(); ++i) { ports.emplace_back(std::move(first_list[i]), std::move(second_list[i])); }
方案四:处理无法默认构造的类型
如果typeA或typeB不支持默认构造,可以用std::optional暂存部分值,等两个成员都就绪后再构造完整的pair:
#include <optional> #include <vector> struct PartialPair { std::optional<typeA> first; std::optional<typeB> second; }; std::vector<PartialPair> temp_storage; // 第一阶段填充first值 temp_storage.push_back({actual_value, std::nullopt}); // 第二阶段填充对应位置的second值 temp_storage[i].second = target_value; // 最终构建完整的pair vector(需确保所有PartialPair的两个成员都已赋值) std::vector<std::pair<typeA, typeB>> ports; for (auto& partial : temp_storage) { ports.emplace_back(std::move(*partial.first), std::move(*partial.second)); }
内容的提问来源于stack exchange,提问作者Puya
相关产品推荐
相关产品推荐

