如何使用迭代器值创建地图?

时间:2017-01-10 09:39:21

标签: c++ c++11

我正在尝试使用K - >地图定义一个类pair的{​​{1}}和V list的迭代器。这是为了实现LRU缓存。我使用了K

decltype

但是,我对使用template <typename K, typename V> class LRUCache { std::list<K> q; typedef decltype(q.begin()) Iterator; typedef std::pair<V, Iterator> Node; int max_size; std::map<const K, Node> m; } 不满意,当我尝试使用它时,它似乎都很脆弱。这样做的规范方法是什么?

3 个答案:

答案 0 :(得分:1)

我完全不喜欢使用typedef的老式方式,因为它似乎使用反向语法来声明内容。您还使用int i = 5而非int 5 i。 (不仅如此),引入了using的新用法。

using Iterator = decltype(a.begin());

如果您不喜欢decltype,可以使用std::list<K>::iterator,但由于K是模板参数,std::list<K>依赖名称,需要以typename为前缀。

using Iterator = typename std::list<K>::iterator;

或者使用老式的typedef

typedef typename std::list<K>::iterator Iterator;

答案 1 :(得分:0)

迭代器的类型是

std::list<K>::iterator

如果你想使用它,你必须在它前面使用typename,或者首先使用

替换它
using iterator = typename std::list<K>::iterator;

然而,使用decltype似乎完全有效地使用它,如果你可以确定每个调用此代码的人都有c ++ 11或更高版本。

答案 2 :(得分:0)

要添加其他人的答案 - std::list<K>::iterator依赖类型,C ++要求我们在其前面使用typename

原因是编译器不知道::iterator是否是一个类型,因此需要提示typename

处理原始问题的另一种方法是使用using模板,类似于在C ++ 14中定义某些<type_traits>的方式。我们可以定义:

template <typename T> using ListIterator = typename std::list<T>::iterator;

现在,我们可以在LRUCache代码中使用ListIterator<K>

template <typename K, typename V> class LRUCache {
  using Node = std::pair<V, ListIterator<K>>;
  std::list<K> q;      
  std::map<const K, Node> m;
  int max_size;
}