std::map中vector值的迭代器

Iterator for vector values in a std::map

本文关键字:迭代器 map std vector      更新时间:2023-10-16

我有一个包含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,我假设)?我还希望能够对指定的键列表的存储值进行迭代。

例如,如果我的map包含这样的数据(为了简洁,切换到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对象中。

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

创建一个类,并使用标准迭代器标签(input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag)之一继承iterator类,具体取决于您想要的迭代器类型。(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);

实现的迭代器应该有对所使用的map(或MyMap对象,取决于你如何实现它)、map中的vector(例如,使用迭代器)和vector中的元素(同样,使用迭代器)的引用。