我对如何使用C ++中的增量工作有一些疑问;
我看过许多关于i ++或++ i的价值的主题,但在用于作业时却没有。
我有一个boost::container::flat_map<std::string, std::string*> param_;
和boost::sregex_token_iterator ii
,其中包含[name,test]。
如果我正在使用char *我会做类似
的事情param[*ii] = new std::string(*(ii + 1));
但它没有用,所以我做了类似的事情:
std::string tmp = *(ii++);
this->param_[tmp] = new std::string(*(ii));
我得到了正确的输出:
name : test;
但是当我尝试在一行上执行此操作时,我没有得到正确的输出: 首先我尝试过:
this->param_[*(ii++)] = new std::string(*(ii));
但我明白了:
id : id;
然后错误地我尝试过:
this->param_[*(++ii)] = new std::string(*(ii));
我得到:
test : name
我理解为什么我首先得到'测试',但不知道为什么我在第二次得到'名字',因为我已经增加了ii?
要显示地图,我只需要
for (auto ii = this->param_.begin(); ii != this->param_.end();++ii)
std::cout << ii->first << ":" << *ii->second << std::endl;
答案 0 :(得分:1)
因为我已经增加了ii?
您似乎对C ++中的评估顺序做出了毫无根据的假设。你没有已经递增ii
,它在同一个语句中的其他地方递增,但ii
的读写相互无序,给出了未定义的行为
关于你的表达式唯一可以说的是函数参数在调用函数之前进行评估(在本例中,operator*
迭代器解除引用函数和映射operator[]
访问函数),但不是评估参数的顺序。
答案 1 :(得分:1)
(ii + 1)
不起作用,因为operator+
仅受RandomAccessIterators支持且sregex_token_iterator
仅为ForwardIterator。
ii++
版本具有未定义的行为,因为您正在单个表达式中读取和写入相同的变量。
如果你真的想在一个声明中这样做,你可以这样做:
param[*ii] = new std::string(*++boost::sregex_token_iterator(ii));
这会生成迭代器的副本并增加副本,而不是原始副本,但不清楚它正在做什么,将它分成多个语句会好得多:
boost::sregex_token_iterator next = ii;
++next;
param[*ii] = new std::string(*next);