我需要创建一个字典数据结构,将矢量映射到唯一数字,反之亦然:
例如,为了将向量映射到唯一数字,我可以执行以下操作:
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 ++数据结构可以有效地执行正向和反向映射。
答案 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]...
}