C++ 从 std::multimap 中查找多个键

sch*_*ck9 1 c++ multimap

我有一个STL::multimapand 我搜索std::list用重复键的值填充 a 。

我可以std::listcount > 1不一一计数的情况下找到/插入所有键的元素值吗?

std::multimap<int, std::string> mm ;
mm[0] = "a" ;
mm[1] = "b" ;
mm[0] = "c" ;
mm[2] = "j" ;
mm[2] = "k" ;


std::list<std::string> lst ;
Run Code Online (Sandbox Code Playgroud)

lst可能包含"a" ,"c","j","k";

我试试这个

template <class K, class V>
class extract_value {
 private:
  K last_key_ ;
  std::list<V> m_list_value ;
  std::pair<K, V> first_elem ;
 public:
 extract_value(const K& k_): last_key_(k_) { }
 void operator() (std::pair<const K, V> elem)
 {
  if (last_key_ == elem.first)
  {
   m_list_value.push_back(elem.second) ;
  }
  else
  {
   // First entry 
   last_key_ = elem.first;
   first_elem= elem ;
  }
 }
 std::list<V> get_value() { return m_list_value ; }
};

ex_ = for_each(mm.begin(),mm.end(), extract_value<int, std::string>(0)) ;
std::list<std::string> lst = ex_.get_value() ;
Run Code Online (Sandbox Code Playgroud)

我不确定这段代码是否可以编译。

mcd*_*ave 5

您使用 equal_range 方法返回限定请求值的一对迭代器,然后在返回的迭代器之间循环。(注意使用 typedef 为简洁起见)。

typedef std::multimap<int, std::string> int_str_mm_t;
std::pair<int_str_mm_t::iterator, int_str_mm_t::iterator> range;

range = mm.equal_range(2);

for (int_str_mm_t::iterator it = range.first; it != range.second; ++it)
{
    lst.push_back(it->second);
}
Run Code Online (Sandbox Code Playgroud)

lst 现在应该包含 { "j", "k" }