我正在制作一个能同时接受多个运算符(例如5x5x5)的计算器。我有一个包含运算符位置的映射,以及它们的类型(x/+-)。我还有一个for循环(auto const&[key,val]:oper_map)
,这是我从这篇文章中获得的。
为了得到左右的数字,我需要知道左右的运算符在哪里。我尝试将std::prev
和std::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
不是迭代器?我也不能递增/递减key
或val
(或者在本文中使用C++11版本时),所以我猜它不算迭代器?我不知道迭代器迷惑了我。
这篇文章似乎是我想要的,但无论出于什么原因,lower_bound()
不能与oper_map
一起工作;没有合适的转换。
否,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
也是同样的情况)。