簡體   English   中英

std :: map中向量值的迭代器

[英]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_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM