1

我对 C++ 中的增量如何工作有一些疑问;

我见过很多关于 i++ 或 ++i 值的主题,但在用于赋值时却没有。

我有一个boost::container::flat_map<std::string, std::string*> param_;boost::sregex_token_iterator ii谁包含[名称,测试]。

如果我正在使用 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;
4

2 回答 2

1

因为我已经增加了 ii?

您似乎对 C++ 中的评估顺序做出了毫无根据的假设。您还没有递增,它正在同一语句的其他地方递增,但是读取和写入彼此之间是无序的,从而产生未定义的行为。iiii

关于您的表达式,唯一可以说的是函数参数是在调用函数之前进行评估(在本例中是operator*迭代器取消引用函数和映射operator[]访问函数),而不是评估参数的顺序。

于 2013-06-16T14:44:19.370 回答
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);
于 2013-06-16T15:37:20.297 回答