Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何仅向映射的值公开映射迭代器_C++_Templates_Map_Stl_Iterator - Fatal编程技术网

C++ C++;如何仅向映射的值公开映射迭代器

C++ C++;如何仅向映射的值公开映射迭代器,c++,templates,map,stl,iterator,C++,Templates,Map,Stl,Iterator,我有一些模板,它们可以有一个映射或一个向量作为底层容器。我希望模板能够向元素公开常量迭代器。我读到的关于如何公开迭代器(例如)的大多数信息都使用 typedef std::vector<int>::iterator iterator; typedef std::vector<int>::const_iterator const_iterator; iterator begin() { return values.begin(); } iterator end() { re

我有一些模板,它们可以有一个映射或一个向量作为底层容器。我希望模板能够向元素公开常量迭代器。我读到的关于如何公开迭代器(例如)的大多数信息都使用

typedef std::vector<int>::iterator iterator;
typedef std::vector<int>::const_iterator const_iterator;
iterator begin() { return values.begin(); }
iterator end() { return values.end(); }
typedef std::vector::iterator迭代器;
typedef std::vector::const_迭代器const_迭代器;
迭代器begin(){返回值。begin();}
迭代器end(){返回值。end();}
但是,对于使用映射的模板来说,这实际上不起作用,因为要访问元素,模板不能再使用
it->SomeMemberFunc()
,而是需要使用
it->second.SomeMemberFunc()
。因此,我希望向map元素公开一个迭代器,它不提供对
键的访问,而只提供map的值

我将如何实现这一点?

一种解决方法

#包括
#包括
模板
结构映射迭代器:公共std::迭代器
{
映射迭代器(){}
映射迭代器(iterj):i(j){
map_迭代器和运算符+++(){++i;返回*this;}
映射迭代器和运算符--(){--i;返回*this;}
布尔运算符==(映射迭代器j)常量{return i==j.i;}
布尔运算符!=(映射迭代器j)常量{return!(*this==j);}
typename映射迭代器::引用运算符*(){return i->second;}
typename映射迭代器::指针运算符->(){return&i->second;}
映射迭代器运算符--(int){return std::prev(-(*this));}
map_迭代器操作符++(int){return std::next(++*this));}
受保护的:
Iter i;
};
模板
内联映射迭代器生成映射迭代器(Iter j){
返回映射迭代器(j);
}
然后

int main() {
    std::map<int,std::string> m {{1, "Hi"},{2, "Bye"}};

    for (auto i=make_map_iterator(m.begin()); i!=make_map_iterator(m.end());i++)
        cout << *i << endl;
}
intmain(){
映射m{{1,“Hi”},{2,“Bye”};
for(auto i=make_-map_迭代器(m.begin());i!=make_-map_迭代器(m.end());i++)

看不见。根据您使用这些迭代器的目的,只提供(而不是迭代器)可能更容易一个for_each样式的成员函数,它对所有元素进行回调。你可以很容易地将其专门化为map version.Perfect.Re.post增量,这些增量实际上是正确的吗?看起来是前后两次,括号是不同的一次…@Cookie:谢谢,当前的post使用正确。我刚刚尽量减少代码行数。
int main() {
    std::map<int,std::string> m {{1, "Hi"},{2, "Bye"}};

    for (auto i=make_map_iterator(m.begin()); i!=make_map_iterator(m.end());i++)
        cout << *i << endl;
}