![](/img/trans.png)
[英]Use std::vector::iterator to alter values stored in std::vector?
[英]Iterator for vector values in a std::map
我有一個包含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,我想)? 我還希望能夠遍歷指定鍵列表的存儲值。
例如,如果我的地圖包含這樣的數據(為了簡潔起見,請切換到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
對象存儲在平面列表中的類中創建另一個UPtrVec
。 但是,除非將密鑰信息嵌入到U
對象中,否則我將丟失允許我根據密鑰值進行過濾的映射。
您可以僅使用標准C ++創建自己的迭代器:
創建一個類,如果繼承iterator
使用標准的iterator標簽(一類input_iterator_tag
, output_iterator_tag
, forward_iterator_tag
, bidirectional_iterator_tag
, random_access_iterator_tag
這取決於你想迭代器的類型)。 (對於您顯示的示例, 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
對象,具體取決於您如何實現),地圖中的向量(例如,使用迭代器)和向量中的元素(同樣,例如,使用迭代器)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.