从 for 循环获取地图中的上一个或下一个项目

Get the previous or next item in a map from a for loop

我正在制作一个可以同时接受多个运算符的计算器(例如 5x5x5)。我有一张地图,其中包含运算符的位置以及它们的类型 (x/+-)。我还有一个 for 循环 for (auto const& [key, val] : oper_map) 我从 this post.

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

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 不是迭代器?我也不能 increment/decrement keyval(或者在 this post 中使用 C++11 版本时),所以我猜它不会算不算迭代器?我不知道迭代器让我困惑。

This post 似乎 是我想要的,但出于某种原因 lower_bound() 不适用于 oper_map;没有合适的转换。

没有。 key 不是迭代器。

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

key 是对映射中键的 const 引用。如果你想要迭代器,使用迭代器:

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::pair<Key,MappedValue>> 更方便(请注意 std::next 的复杂性对于双向迭代器(映射)是线性的,而对于随机访问迭代器它是常量(向量),std::prev)也是如此。