std::map中vector值的迭代器
Iterator for vector values in a std::map
我有一个包含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中的元素(同样,使用迭代器)的引用。
相关文章:
- 再次获得 std::map 会更改之前的迭代器
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 创建可以遍历 std::map 值的通用模板迭代器的最简单方法是什么?
- 从基于迭代器的for循环转换后,如何在map::find()中调用方法
- 为什么我不能在 c++ 中"map"的迭代器中使用"+1"?
- Map中的(字符串的)向量迭代器
- 访问基于范围的循环(如for_each)中的std::map迭代器
- map<int,int>的*迭代器是什么?它不是pair<int,int>
- std::map 擦除 - 将迭代器传递给错误的映射
- C++ Map erase(),迭代器打印 erased 元素
- 由于从 std::map 派生的类中的 std::map 迭代器导致的内存错误
- C++ std::map 和 std::set 擦除复制值,从而使迭代器失效
- 如果迭代器的迭代器永远不会无效,则是STD :: MAP访问线程安全
- SIGBUS 尝试递增 std::map 迭代器时
- C 迭代器从Typedef std :: Map作为模板参数声明
- std::map 线程安全和迭代器失效
- 为什么要对 map::find 应用不存在的键将返回一个C++中第一个值映射大小的迭代器
- 为 map<T1、T2> 迭代器创建模板函数
- std::map<>::迭代器错误
- std :: map :: size()与迭代器不同