在std :: map中迭代矢量值的迭代器

时间:2013-06-07 15:08:54

标签: c++ boost c++11

我有一个包含map的类,它存储shared_ptr个对象的向量。

#include <map>
#include <memory>
#include <vector>

template <class T, class U>
class MyMap {
public:
    typedef std::shared_ptr<U> UPtr;
    typedef std::vector<UPtr> UPtrVec;
    typedef std::map<T, UPtrVec> VecMap;
    ...
private:
    VecMap vec_map;
};

是否可以为每个映射向量值中的值创建一个迭代器(使用boost,我推测)?我还希望能够迭代指定的键列表的存储值。

例如,如果我的地图包含这样的数据(为了简洁而改用Python语法)

 // note: in actuality the vector contents are shared_ptr's to objects
 vec_map[5] = ["one", "two", "three"]
 vec_map[8] = ["four", "five"]
 vec_map[3] = ["six", "seven", "eight", "nine"]

是否可以编写迭代器接口,以便我可以执行以下操作:

MyMap<int, std::string> mymap
...
for(auto it = mymap.begin(), it != mymap.end(); ++it) 
    cout << *it << " ";

并输出“一二三四有五六七八九”?如果我可以让它工作,我想写一个迭代器,它将根据键值进行过滤。

除非我考虑在类中创建另一个UPtrVec,它将所有UPtr个对象存储在一个平面列表中。但是我丢失了允许我根据键值进行过滤的映射,除非我将关键信息嵌入到U对象中。

1 个答案:

答案 0 :(得分:1)

您可以使用标准C ++创建自己的迭代器:

创建一个类,并使用标准迭代器标记iteratorinput_iterator_tagoutput_iterator_tagforward_iterator_tag,{{1}继承if bidirectional_iterator_tag类取决于你想要的迭代器的类型。 (random_access_iterator_tag对于您展示的示例就足够了。

在该类中实现该类型所需的迭代器接口。 (在cppreference.com中,您可以找到每个迭代器的要求)。

input_iterator_tag

实现的迭代器应该对使用过的map(或class MyIterator: public std::iterator<input_iterator_tag, MyClass> { // requirements for iterators MyIterator(const MyIterator&); MyIterator& operator=(const MyIterator&); // or any variant ~MyIterator() noexcept; MyClass& operator*() const; MyIterator& operator++(); // requirements for input iterators MyClass* operator->(); MyIterator operator++(int); }; // requirements for iterators bool operator==(const MyIterator& a, const MyIterator& b); // requirements for input iterators bool operator!=(const MyIterator& a, const MyIterator& b); 对象,取决于你如何实现它),对map中的向量(例如,使用迭代器)和向量中的元素(再次,例如,使用迭代器)。