将multimap的子集复制到新的multimap中

时间:2015-03-17 19:35:55

标签: c++ multimap

// this has data from elsewhere, just showing its the same type
multimap<string,string> map_with_data;
string string_key = "some_string";

// not working:
multimap<string,string> new_map;

new_map = map_with_data[string_key];

我想要返回一个只包含密钥string_key的密钥对的多图。这样做的正确方法是什么,或者这种直接复制的方法是否可行?

我收到了:error: no match for ‘operator[]’ (operand types are ‘std::multimap<std::basic_string<char>, std::basic_string<char> >’ and ‘std::string {aka std::basic_string<char>}’)|

1 个答案:

答案 0 :(得分:1)

以下内容将是我的首选:

auto r = map_with_data.equal_range(string_key);

multimap<string, string> new_map(r.first, r.second);

这将使用指定的键查找现有映射中的所有项,然后从这些迭代器初始化新映射。如果现有地图中没有包含该键的项目,则r.first和r.second都会获得map_with_data.end(),因此您的new_map将会空出来(正如您可能预期的那样) )。

如果真的想要,您可以使用lower_boundupper_bound代替equal_range

multimap<string, string> new_map {
    map_with_data.lower_bound(string_key), 
    map_with_data.upper_bound(string_key) };

我更喜欢使用equal_range的代码。

演示代码:

#include <map>
#include <string>
#include <iostream>
#include <iterator>

using namespace std;

namespace std {
    ostream &operator<<(ostream &os, pair<string, string> const &p) {
        return os << "(" << p.first << ", " << p.second << ")";
    }
}

int main() {

    multimap<string, string> map_with_data {
        {"A", "B"},
        {"A", "C"},
        {"B", "B"},
        {"B", "C"}
    };

    auto r = map_with_data.equal_range("A");

    multimap<string, string> new_map(r.first, r.second);

    copy(new_map.begin(), new_map.end(), 
        ostream_iterator<pair<string, string>>(std::cout, "\n"));
}

结果:

(A, B)
(A, C)