提问者:小点点

从for循环获取映射中的上一项或下一项


我正在制作一个能同时接受多个运算符(例如5x5x5)的计算器。我有一个包含运算符位置的映射,以及它们的类型(x/+-)。我还有一个for循环(auto const&[key,val]:oper_map),这是我从这篇文章中获得的。

为了得到左右的数字,我需要知道左右的运算符在哪里。我尝试将std::prevstd::next一起使用,如下所示:

int loper_pos = -1;
int roper_pos = 0;
double lnum;
double rnum;
char loper;
char roper;

//map defined elsewhere
for (auto const& [key, val] : oper_map)
{
    //loper is left operator while roper is right opeprator

    //tracks the position of the loop
    int map_pos = std::distance(oper_map.begin(), oper_map.find(key)); 

    if (map_pos == 0) loper_pos = -1;
    else
    {
        loper_pos = std::prev(key);
        loper = std::prev(val);
    }
    if (map_pos == oper_map.size()) roper_pos = oper_map.size() + 1;
    else
    {
        roper_pos = std::next(key);
        roper = std::next(val);
    }

但我想它不起作用,因为key不是迭代器?我也不能递增/递减keyval(或者在本文中使用C++11版本时),所以我猜它不算迭代器?我不知道迭代器迷惑了我。

这篇文章似乎是我想要的,但无论出于什么原因,lower_bound()不能与oper_map一起工作;没有合适的转换。


共1个答案

匿名用户

否,key不是迭代器。

for (auto const& [key, val] : oper_map)

是对映射中键的常量引用。如果需要迭代器,请使用迭代器:

for (auto it = oper_map.begin(); it != oper_map.end(); ++it) {
    auto next = std::next(it);
    auto prev = std::prev(it);
}

但是,请考虑std::map不是一个顺序容器。如果您对容器中元素的位置感兴趣,可能std::vector>更方便(注意,std::next的复杂度对于双向迭代器(map)是线性的,而对于随机访问迭代器(vector)是常数的,std::prev也是同样的情况)。