C ++执行向量和唯一数字之间的映射,反之亦然

时间:2015-07-01 04:05:53

标签: c++ c++11

我需要创建一个字典数据结构,将矢量映射到唯一数字,反之亦然:

例如,为了将向量映射到唯一数字,我可以执行以下操作:

   vector   ---------> unique number
   (0,7,8)                   0
   (0,8,10)                  1
   (1,2,9)                   2
   (1,2,10)                  3
   (1,3,1)                   4

然后我需要将唯一数字映射回矢量,例如如下:

   unique numbers --------> vector   
   0                        (0,7,8)    
   1                        (0,8,10)   
   2                        (1,2,9)    
   3                        (1,2,10)   
   4                        (1,3,1)    

我试图通过创建整数和向量的结构来进行这种映射 - 然而,这变得非常低效。是否有一些c ++数据结构可以有效地执行正向和反向映射。

3 个答案:

答案 0 :(得分:2)

boost::bimap具有与您所描述的功能相同的功能。

它类似于std::map,但允许该对中的任何一个元素成为另一个元素的键。

答案 1 :(得分:1)

有Boost.Bimap。这是与Bimap Is there a Boost.Bimap alternative in c++11?相关的问题。

简而言之,您可以拥有两张地图,每张关系一张(id - > vec,vec - > id)。

答案 2 :(得分:0)

[问题评论中要求的例子]

总之,这使得排序顺序中的数组索引成为标识特定vector<int>的“唯一编号”,并使用std::lower_bound搜索特定vector<int>。实际上,get_vec_id只是一个便利函数,如果你发现处理向量索引((size_t)-1是一个“未找到的”哨兵值)比直接重复使用lower_bound更直观和处理迭代器。

当插入和/或擦除vector<int>s散布查找时,这不是很方便,因为1)先前检索的索引都是无效的,2)在向量中插入和擦除是O(n) 。但是,当数据首先准备好然后完成大量查找时,这是非常好的。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

template <typename Data>
size_t get_vec_id(const Data& data, const typename Data::value_type& value)
{
    auto it = std::lower_bound(data.begin(), data.end(), value);
    if (it != data.end() && *it == value)
        return it - data.begin();
    else
        return (size_t)-1;
}

int main()
{
    std::vector<std::vector<int>> data =
        { { 0,7,8 },
          { 0,8,10 },
          { 1,2,9 },
          { 1,2,10 },
          { 1,3,1 } };

    std::cout << get_vec_id(data, {0, 7}) << '\n';
    std::cout << get_vec_id(data, {0, 7, 8}) << '\n';
    std::cout << get_vec_id(data, {0, 7, 9}) << '\n';
    std::cout << get_vec_id(data, {1, 2, 9}) << '\n';
    std::cout << get_vec_id(data, {1, 2, 11}) << '\n';
    std::cout << get_vec_id(data, {1, 3, 1}) << '\n';
    std::cout << get_vec_id(data, {1, 4, 1}) << '\n';

    // to map from a "vec_id" to a vector, use data[vec_id]...
}