当前位置: 首页 > 知识库问答 >
问题:

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

翟俊远
2023-03-14

我正在制作一个能同时接受多个运算符(例如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个答案

柯波峻
2023-03-14

否,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也是同样的情况)。

 类似资料:
  • 问题内容: 我正在使用带有node_redis的Node.js,并遍历一个对象并在Redis中查找数据,然后返回结果。 我有这样的设置: 问题在于,它会在完成对redis的调用之前循环通过。因此,在实际更新总值之前,将调用回调。由于延迟,它似乎也跳过了一些项目。 有没有更好的方法来解决这个问题? 谢谢! 编辑: 好的,所以我这样更新了它: 这似乎可行,它在适当的时间触发了回调,但是似乎只有最后一个

  • 问题内容: 在遍历列表的Python循环中,我们可以编写: 并巧妙地遍历列表中的所有元素。有没有办法知道循环中到目前为止我循环了多少次?例如,我要列出一个清单,在处理完10个元素之后,我想对它们进行处理。 我考虑过的替代方案可能是: 要么: 是否有更好的方法(就像)来获得到目前为止的迭代次数? 问题答案: pythonic的方法是使用:

  • 问题内容: 我有一个foreach循环,我想看看循环中是否存在下一个元素,以便可以将当前元素与下一个元素进行比较。我怎样才能做到这一点?我已经阅读了有关当前和下一个功能的信息,但我不知道如何使用它们。 提前致谢 问题答案: 一种独特的方法是反转阵列 然后 循环。这同样适用于非数字索引数组: 如果您仍然对使用和功能感兴趣,可以这样做: #2可能是最好的解决方案。注意,比较数组中的最后两项后,将停止循

  • 问题内容: 我想从Java 8中检索和删除下一个项目,而不会关闭它。 这可能吗? 问题答案: 基于Stuart的回答,并进行了从Iterator到Stream的转换,我想到了以下快速而又简单的包装器类。它没有经过测试,也不是线程安全的,但是它为我提供了我目前需要的—移除并使用单个项目,同时保持 此 流“开放”。 提供一种方法,该屏蔽远的 终端流操作 的语义: 一个小测试:

  • 我有一个父类和子类,其各自的DTO如下 当我试图将父映射到父映射到父映射到父映射时,我得到了堆栈溢出错误。 请帮我解决这个问题。

  • 我的问题是,我试图在一个数组上迭代多次,但是,我的for循环只会在该数组上迭代一次(或者在我看来是这样),这会导致结果错误。 我试图在这个数组上循环: