关于增量和赋值的说明

时间:2013-06-16 14:39:49

标签: c++ c++11

我对如何使用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;

2 个答案:

答案 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);