0

我有一个包含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对象中。

4

1 回答 1

1

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

创建一个类并iterator使用标准迭代器标记(input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag)之一继承 if 类,具体取决于您想要的迭代器类型。(input_iterator_tag对于您展示的样本就足够了)。

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

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);

实现的迭代器应该引用使用的映射(或MyMap对象,取决于您如何实现)、映射中的向量(例如,使用迭代器)和向量中的元素(同样,对于例如,使用迭代器)。

于 2013-06-07T15:35:14.480 回答