如何将make_pair返回值赋值给inserter?关联与实现求助
问题解决:std::make_pair 和 inserter 怎么配合用
先搞懂两个工具的关系
- std::make_pair:就是帮你快速生成
pair对象的工具,不用手动写std::pair<类型,类型>,直接传两个值就行,它会自动推导类型。比如std::make_pair("mel", "ana")就生成了一个存两个字符串的pair。 - inserter(插入迭代器):
std::inserter是个辅助函数,返回的是个特殊迭代器。这个迭代器最特别的地方是——当你给它赋值的时候,它会自动调用目标容器的insert方法,把值插到容器里。简单说,它就是个“自动插入的工具人”。
两者的配合逻辑:用make_pair造出你要存储的pair数据,把这个数据“给”插入迭代器,迭代器就会自动帮你把数据插到指定容器里。
你的代码问题与修正
1. 目标容器选错了
你原来定义的l3是单个std::pair,但插入迭代器是给容器用的(比如装一堆pair的vector),单个pair根本装不下多个插入结果,得改成容器类型。
2. inserter参数写错了
std::inserter需要两个参数:第一个是你要插入的容器,第二个是插入位置的迭代器(比如要插到容器末尾,就传容器.end())。
3. 循环逻辑有bug
原代码的循环条件beg1 != beg2完全错误——beg2是第二个容器的起始迭代器,永远不可能等于beg1,会直接死循环。而且原来只有当条件不满足时才移动迭代器,也会导致死循环,得每次循环都移动两个迭代器。
修正后的完整代码
#include <iostream> #include <vector> #include <exception> #include <utility> #include <iterator> // 必须包含这个头文件才能使用std::inserter template<typename T, typename U, typename K> void fun(T beg1, T end1, U beg2, U end2, std::insert_iterator<std::vector<std::pair<typename T::value_type, typename U::value_type>>> ins, K comp) { try { if (std::distance(beg1, end1) != std::distance(beg2, end2)) { throw std::string{"两个容器大小不一致"}; } } catch (const std::string& ex) { std::cout << ex << std::endl; return; // 抛出异常后直接返回,避免后续错误执行 } while (beg1 != end1 && beg2 != end2) { if (!comp(*beg1, *beg2)) { // 给插入迭代器赋值,它会自动把pair插入到目标容器 *ins = std::make_pair(*beg1, *beg2); ++ins; // 迭代器自增,方便后续插入(insert_iterator自增是无操作,但写法更规范) } ++beg1; ++beg2; } } int main() { std::vector<std::string> l1{"mel", "ana", "tim"}; std::vector<std::string> l2{"ana", "mel", "tim"}; // 将l3改为存储pair的vector容器 std::vector<std::pair<std::string, std::string>> l3; auto compare = [](const std::string& a, const std::string& b) { return a == b; }; // 调用fun时,用std::inserter指定插入到l3的末尾 fun(begin(l1), end(l1), begin(l2), end(l2), std::inserter(l3, l3.end()), compare); // 打印结果验证 std::cout << "插入的不匹配pair:" << std::endl; for (const auto& p : l3) { std::cout << "(" << p.first << ", " << p.second << ")" << std::endl; } return 0; }
代码补充说明
<iterator>头文件是必须的,否则无法使用std::inserter。- 异常处理中添加
return,避免抛出异常后继续执行循环导致错误。 - 插入迭代器的
*ins = ...是标准写法,也可以直接写ins = ...,效果一致,但前者更符合迭代器的使用逻辑。
运行结果
代码会输出两个不匹配的pair:
插入的不匹配pair: (mel, ana) (ana, mel)
内容的提问来源于stack exchange,提问作者Xavi
相关产品推荐
相关产品推荐

