我有一个包含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
对象中。
答案 0 :(得分:1)
您可以使用标准C ++创建自己的迭代器:
创建一个类,并使用标准迭代器标记iterator
,input_iterator_tag
,output_iterator_tag
,forward_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中的向量(例如,使用迭代器)和向量中的元素(再次,例如,使用迭代器)。