У меня есть класс, содержащий map
, в котором хранятся векторы shared_ptr
объектов.Итератор для векторных значений в std :: map
#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
.
* «И у вас есть выход» один два три четыре пять шесть семь восемь девять?? »* - Вы имеете в виду *« шесть семь восемь девять один два три четыре пять »*, верно? –
Мимический стандартный контейнер (например, MyMap, MeVector, MyQueue и т. Д.) - непростая задача и часто задает вопросы дизайну. – maverik
@ChristianRau хороший пункт! – jasonm76