2011-10-23 19 views
7

我在找C++中的一个函数,用于交换地图的内容... 即: 那些现在是密钥的密钥现在成为项目和那些这些项目现在是关键。 你能告诉我,如果有什么关于这件事?在C++中交换密钥和地图的值

+5

您可能想对multimap进行此操作,因为地图中的值不一定是不同的。 –

+0

我相信我的地图的价值都是唯一的:没有 重复 – Safari

回答

13

正如Geoffroy所说,std::map不允许这种行为。但是,您可能需要使用类似STL的容器Boost.Bimap - 双向映射。

Bimap是一种数据结构,它表示两个集合的元素之间的双向关系。该容器被设计为作为两个相反的STL地图工作。集合X与集合Y之间的bimap可以被视为从X到Y(该视图将被称为左侧地图视图)或从Y到X(称为右侧地图视图)的地图。

1

有没有标准的方法/方法来做到这一点,你必须编写自己的函数。

这不是一件很难做的事情,但首先要考虑以不同的方式来做。

如果你不得不反转你的键/值,那么你的代码可能会很糟糕,尽管你不保留容器的逻辑。

如果您想了解更多信息,请解释您为什么要这么做。

+0

我认为boost有一个迭代器适配器可能会使这个容易 –

+0

是的,也许,我不知道那么多关于提升的时刻。但这并不难。 – Geoffroy

+0

我必须读取一个带有row-id字符串的文件。我需要我的算法,这个值是一个整数(出于效率的原因,而不是字符串)使用地图与这些字符串关联一个id唯一。在地图中,我intID字符串。我需要以我的旧格式id-string获得算法的结果,因此对于映射的所有相应值中的每个IdInt搜索字符串,我都有。为了加速这可以做一个交换 – Safari

1

插入地图中的项放入多重映射 - 第一值,第二键,条件是比较原始地图的两个值适当的比较功能。一旦插入了所有值键项目,multimap将按预期进行排序。任务完成!

1
template <class T1, class T2> 
map<T2, T1> swapPairs(map<T1, T2> m) { 
    map<T2, T1> m1; 

    for (auto&& item : m) { 
     m1.emplace(item.second, item.first); 
    } 

    return m1; 
}; 

int main() { 
    map<string, int> m; 
    m.emplace("111",5); 

    cout << m.at("111") << endl; // 5 

    map<int,string> m1 = swapPairs(m); 

    cout << m1.at(5) << endl; // 111 

    return 0; 
}