从 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::prev
和 std::next
与 key
一起使用,如下所示:
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 key
或 val
(或者在 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
)也是如此。
我正在制作一个可以同时接受多个运算符的计算器(例如 5x5x5)。我有一张地图,其中包含运算符的位置以及它们的类型 (x/+-)。我还有一个 for 循环 for (auto const& [key, val] : oper_map)
我从 this post.
为了得到左右数,我需要知道左右运算符在哪里。我尝试将 std::prev
和 std::next
与 key
一起使用,如下所示:
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 key
或 val
(或者在 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
)也是如此。