如何用std::bind实现multimap中获取下一个Product的GetNextProduct函数?
我来帮你搞定这个getNextProduct函数的实现,刚好能满足你用std::bind配合find_if的要求。先看看你代码里的几个小问题,再给你完整的可行方案:
完整实现方案
首先假设你的Product类有getReference()方法返回产品编号(也就是multimap的键),且multimap是ProductManager的成员变量(比如命名为products_)。
1. 可运行的完整函数代码
#include <functional> #include <algorithm> #include <map> // 先补充Product类的基础定义(方便你对应自己的代码) class Product { public: int getReference() const { return reference_; } // 你的其他产品成员方法/属性... private: int reference_; }; class ProductManager { private: std::multimap<int, Product*> products_; // 存储产品的成员变量 public: Product* getNextProduct(Product* product) const { // 先处理空指针输入,避免崩溃 if (!product) { return nullptr; } // 计算要找的下一个产品编号:当前产品编号+1 int targetProductId = product->getReference() + 1; // 用std::bind配合find_if查找第一个匹配目标编号的产品 auto it = std::find_if(products_.begin(), products_.end(), std::bind(&std::pair<const int, Product*>::first, std::placeholders::_1) == targetProductId); // 找到就返回对应产品指针,没找到返回nullptr return (it != products_.end()) ? it->second : nullptr; } };
2. 关键逻辑解释
- 空指针防护:先判断输入的
product是否为空,避免后续调用getReference()时触发未定义行为。 - 目标编号计算:你原代码里漏了
getReference()的括号,这里要调用函数才能拿到产品编号,再加1得到我们要找的“下一个”编号。 - std::bind的用法:
std::bind(&std::pair<const int, Product*>::first, std::placeholders::_1)会从multimap的每个元素(本质是pair<const int, Product*>)中取出键值(也就是产品编号)。- 我们直接判断这个取出的键值是否等于
targetProductId,find_if会遍历整个multimap,返回第一个满足条件的元素迭代器。
- 结果返回:找到匹配元素就返回对应的
Product*,没找到则返回nullptr。
3. 针对multimap特性的扩展方案
因为是multimap,可能存在多个相同编号的产品。如果你需要返回所有匹配“下一个编号”的产品,可以用equal_range替代find_if:
std::vector<Product*> getAllNextProducts(Product* product) const { std::vector<Product*> result; if (!product) { return result; } int targetProductId = product->getReference() + 1; auto [startIt, endIt] = products_.equal_range(targetProductId); for (auto it = startIt; it != endIt; ++it) { result.push_back(it->second); } return result; }
4. 你原代码的问题修正
Product* productTemp; ProductTemp->setReference(...):这里productTemp是未初始化的野指针,直接调用成员函数会导致崩溃,而且我们根本不需要临时Product对象,直接计算目标编号即可。getReference+1:这里缺少函数调用的括号,应该是getReference() + 1才能拿到产品编号的值。
内容的提问来源于stack exchange,提问作者ShomaliParty
相关产品推荐
相关产品推荐

