C++ boost无序映射反向foreach
我发现,BOOST\u REVERSE\u FOREACH与BOOST\u FOREACH的工作方式不同 我的代码:C++ boost无序映射反向foreach,c++,boost,iteration,reverse,unordered-map,C++,Boost,Iteration,Reverse,Unordered Map,我发现,BOOST\u REVERSE\u FOREACH与BOOST\u FOREACH的工作方式不同 我的代码: #include <boost\unordered_map.hpp> #include <boost\foreach.hpp> #include <iostream> #include <string> typedef boost::unordered_map<std::string, int> map; int m
#include <boost\unordered_map.hpp>
#include <boost\foreach.hpp>
#include <iostream>
#include <string>
typedef boost::unordered_map<std::string, int> map;
int main()
{
map MyMap;
MyMap["two"] = 2;
MyMap["three"] = 3;
MyMap["one"] = 1;
std::cout << MyMap["one"] << MyMap["two"] << MyMap["three"] << std::endl;
BOOST_FOREACH (map::value_type value, MyMap)
{
std::cout << value.second;
}
std::cout << std::endl;
system("pause");
return 0;
}
#包括
#包括
#包括
#包括
typedef boost::无序的_映射;
int main()
{
地图我的地图;
MyMap[“两个”]=2;
MyMap[“三”]=3;
MyMap[“一个”]=1;
std::cout简言之,您不会反向迭代无序的映射
unordered_map
不提供顺序。因此,在容器上迭代会产生任意顺序。如果可以反向迭代,则会产生同样任意的顺序。如果应用程序需要反向迭代unordered_map
,则应用程序依赖于顺序,并且不能安全地使用无序的\u映射
。因此,应考虑其他容器类型。例如:
- 如果插入顺序很重要,并且从不进行查找,则使用
std::vector
- 如果插入顺序很重要,并且出现查找,那么考虑。
为了扩展编译器错误,Boost.ForEach尝试获取rbegin和rend迭代器。最后,Boost.ForEach将尝试使用调整后的序列::迭代器,要求调整后的迭代器是双向迭代器。虽然迭代器类型是实现定义的,但它至少必须是正向迭代器。因此,当反向e_迭代器
是递增的,它递减基础迭代器,导致编译器错误,因为Sequence::iterator不提供一元递减运算符(--
)。简言之,您不会反向迭代无序的
映射
unordered_map
不提供顺序。因此,在容器上迭代会产生任意顺序。如果可以反向迭代,则会产生同样任意的顺序。如果应用程序需要反向迭代unordered_map
,则应用程序依赖于顺序,并且不能安全地使用无序的\u映射
。因此,应考虑其他容器类型。例如:
- 如果插入顺序很重要,并且从不进行查找,则使用
std::vector
- 如果插入顺序很重要,并且出现查找,那么考虑。
为了扩展编译器错误,Boost.ForEach尝试获取rbegin和rend迭代器。最后,Boost.ForEach将尝试使用调整后的序列::迭代器,要求调整后的迭代器是双向迭代器。虽然迭代器类型是实现定义的,但它至少必须是正向迭代器。因此,当反向e_迭代器
递增,它递减基础迭代器,导致编译器错误,因为Sequence::iterator不提供一元递减运算符(--
).编译器在编译失败时会给你什么错误消息?编译器在编译失败时会给你什么错误消息?坦纳说了什么。BOOST\u REVERSE\u FOREACH
至少需要一个双向迭代器。BOOST::unordered\u map::iterator
只是一个正向迭代器。你不能表达任何特定的或重复考虑到无序容器的本质,(旁白:我是BOOST\u FOREACH
的作者。请停止使用它。改用C++11的基于范围的for循环。)Tanner所说。BOOST\u REVERSE\u FOREACH
至少需要一个双向迭代器。BOOST::unordered\u map::iterator
只是一个正向迭代器。考虑到无序容器的本质,您无法表达任何特定的顺序。(旁白:我是BOOST\u FOREACH
的作者。请停止使用它。改用C++11的基于范围的for循环。)
BOOST_REVERSE_FOREACH (map::value_type value, MyMap)
{
std::cout << value.second;
}
std::cout << std::endl;
1>c:\boost_1_52_0\boost\iterator\reverse_iterator.hpp(45): error C2675: unary '--' : 'boost::unordered::iterator_detail::iterator<NodePointer,Value>' does not define this operator or a conversion to a type acceptable to the predefined operator
1> with
1> [
1> NodePointer=boost::unordered::detail::ptr_node<std::pair<const std::string,int>> *,
1> Value=std::pair<const std::string,int>
1> ]
1> c:\boost_1_52_0\boost\iterator\reverse_iterator.hpp(45) : while compiling class template member function 'void boost::reverse_iterator<Iterator>::increment(void)'
1> with
1> [
1> Iterator=boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::string,int>> *,std::pair<const std::string,int>>
1> ]
1> c:\boost_1_52_0\boost\iterator\iterator_facade.hpp(520) : see reference to function template instantiation 'void boost::reverse_iterator<Iterator>::increment(void)' being compiled
1> with
1> [
1> Iterator=boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::string,int>> *,std::pair<const std::string,int>>
1> ]
1> c:\boost_1_52_0\boost\foreach.hpp(266) : see reference to class template instantiation 'boost::reverse_iterator<Iterator>' being compiled
1> with
1> [
1> Iterator=boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::string,int>> *,std::pair<const std::string,int>>
1> ]
1> c:\users\t3\documents\projects\boost unorderedmap test\boost unorderedmap test\main.cpp(25) : see reference to class template instantiation 'boost::foreach_detail_::auto_any<T>' being compiled
1> with
1> [
1> T=boost::reverse_iterator<boost::unordered::iterator_detail::iterator<boost::unordered::detail::ptr_node<std::pair<const std::string,int>> *,std::pair<const std::string,int>>>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========