具有基于范围的循环遍历 equal_range 的 C++ 多图:错误消息 [重复]

Posted

技术标签:

【中文标题】具有基于范围的循环遍历 equal_range 的 C++ 多图:错误消息 [重复]【英文标题】:C++ multimap with range-based for loop iterating over equal_range: error message [duplicate] 【发布时间】:2018-09-07 14:25:40 【问题描述】:

我正在尝试使用基于范围的 for 循环来迭代 multimap 的 equal_range。我正在模仿我看到的发布的代码,但出现错误。

#include <iostream>
#include <map>

int main() 
    std::multimap<const unsigned long, const std::string> colors;

    colors.insert(2UL, "red");
    colors.insert(2UL, "orange");
    colors.insert(3UL, "yellow");
    colors.insert(4UL, "green");
    colors.insert(4UL, "blue");
    colors.insert(5UL, "violet");

    for (const auto &it : colors.equal_range(4UL)) 
        std::cout << "    " << it.second << std::endl;
    

以下是编译时发生的情况:

g++ --version
g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)

g++ 
$g++ -o foo foo.cc
foo.cc: In function ‘int main()’:
foo.cc:14:49: error: no matching function for call to 
‘begin(std::pair<std::_Rb_tree_iterator<std::pair<const long unsigned int, const std::__cxx11::basic_string<char> > >, std::_Rb_tree_iterator<std::pair<const long unsigned int, const std::__cxx11::basic_string<char> > > >&)’
 for (const auto &it : colors.equal_range(4UL)) 

我最后一次使用 C++ 是在 C++11 之前。我做错了什么?

【问题讨论】:

从链接(重复)答案中的信息来看,这似乎实际上是 C++11 草案版本中的合法代码。我看到发布类似代码的网页一定是使用了基于草稿的早期版本的编译器。 【参考方案1】:

std::multimap::equal_range 返回std::pair&lt;iterator,iterator&gt;

range-based for-loop不直接支持。

使用c++20,您现在可以使用std::ranges::subrange 对其进行调整。

#include <iostream>
#include <map>
#include <ranges>

int main() 
    std::multimap<const unsigned long, const std::string> colors;

    colors.insert(2UL, "red");
    colors.insert(2UL, "orange");
    colors.insert(3UL, "yellow");
    colors.insert(4UL, "green");
    colors.insert(4UL, "blue");
    colors.insert(5UL, "violet");
    
    for (auto [begin,end]=colors.equal_range(4UL); const auto &it : std::ranges::subrangebegin, end) 
        std::cout << "    " << it.second << std::endl;
    

WandBox Link

【讨论】:

以上是关于具有基于范围的循环遍历 equal_range 的 C++ 多图:错误消息 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用基于范围的 for 循环遍历指针列表

[C++11]基于范围的for循环

使用std :: equal_range查找字符串向量中出现的前缀范围

C++11 基于范围的for循环

VBA循环遍历2个不同大小的范围

std::equal_range 不适用于具有 operator< 定义的结构