10

我的目标是将一种类型的元素映射到相同类型的其他元素。假设它们是size_t为了简单。

std::map<size_t, size_t> myMapping;

这样做可以,但如果我想关注一堆这样的链接(它们都是同一张地图),每一步都是一个log(n)查找。

size_t k = /*whatever*/;
myMapping[myMapping[myMapping[k]]];   //3 * log(n)

我想利用 map 迭代器保持有效并且有一个 map 将 size_t 映射到 iterators 自身的事实。

typedef /*myMapTemplate*/::iterator map_iter;
std::map<size_t, map_iter> myMapping;

size_t k = /*whatever*/
map_iter entryPoint = myMapping.find(k);
entryPoint->second->second->first;   //log(n) + 2 constant time operations

我将如何写这种类型?我知道复制会将迭代器保留在旧地图上,并计划自己解决这个问题。

4

2 回答 2

6

我了解您想要地图的问题:key->map<key,>::iterator

所以,这里是一个以映射迭代器为值的结构:

template <
    template <class K, class V, class C, class A> class mapImpl, 
   class K, 
   class V, 
   class C=std::less<K>, 
   class A=std::allocator<std::pair<const K, V> >
>
class value_with_iterator {
public:
   typedef typename mapImpl<const K,value_with_iterator,C,A>::iterator value_type;
   value_type value;
};

使用上述结构定义的映射:

typedef std::map<size_t, value_with_iterator <std::map, size_t, size_t> > map_size_t_to_itself;

一些插入方法 - 将密钥与自身链接:

map_size_t_to_itself::iterator insert(map_size_t_to_itself& mapRef, size_t value)
{
   map_size_t_to_itself::value_type v(value, map_size_t_to_itself::mapped_type());
   std::pair<map_size_t_to_itself::iterator, bool> res = mapRef.insert(v);
   if (res.second) 
     res.first->second.value = res.first;
   return res.first;
}

和简单的测试:

int main() {
   map_size_t_to_itself mapObj;
   map_size_t_to_itself::iterator i1 = insert(mapObj, 1);
   map_size_t_to_itself::iterator i2 = insert(mapObj, 1);
   map_size_t_to_itself::iterator i3 = insert(mapObj, 2);

   std::cout << i1->first << ": " << i1->second.value->first << std::endl;
   std::cout << i2->first << ": " << i2->second.value->first << std::endl;
   std::cout << i3->first << ": " << i3->second.value->first << std::endl;
}

输出:

1: 1
1: 1
2: 2

完整链接:http: //ideone.com/gnEhw

于 2012-10-10T14:20:48.727 回答
2

如果我正确理解了您的问题,我想我会将我的元素保存在一个向量中,并在第一个向量中使用索引向量来实现您想要的间接类型。如果您还需要有序访问,您始终可以将映射放入第一个向量的元素。

于 2012-10-10T10:41:53.277 回答