0

此代码如何找到非正值?

#include <map>
#include <cstdio>

#define until(cond) while(!(cond))

using namespace std;

int main() {
  // initialization
  map<int,int> second;
  int i=10;
  int testme[10]={4,3,1,-3,7,-10,33,8,4,14};
  while (i --> 0) second[i]=testme[i];

  // find the first non-positive value in second
  map<int,int>::reverse_iterator p = --second.rend();
  do {
    printf("Is %d non-positive?\n",second[++i]);
  } until(-- p --->   second < 0);
    // "second < 0" to check if the value in second is non-positive

  printf("Yes it is!\n");
}

输出是:

Is 4 non-positive?
Is 3 non-positive?
Is 1 non-positive?
Is -3 non-positive?
Yes it is!

那么“second < 0”字符串如何检查非正值呢?

4

2 回答 2

7

解析的一些提示--p--->second。它被评估为--((p--)->second)。(感谢@AProgrammer 修复了我的明显错误!)

  • p是指针或迭代器。

  • p--递减p,但将其先前的值作为右值返回

  • (p--)->second访问该值的成员second

  • --((p--)->second)递减该值(即映射值)并返回新的递减值

  • 将新值与0

笔记:

  • p--负责迭代容器。请注意,循环不会对p.

  • 外部--使0计数为负数。作为副作用,循环会递减映射中的每个值。

  • 第二种用法i有点多余。您可以p->second在循环中而不是在循环中编写second[++i],因为您已经有一个迭代器。实际上,second[++i]需要进行整棵树搜索。

代码等价于:

do { /* ... */
    auto q = p;
    --p;
    --(q->second);
} until (q->second < 0);
于 2012-08-23T09:08:56.697 回答
0

实际上它检查值是否不是正数,而不是负数: http: //liveworkspace.org/code/587a9554a2b0b8f830179518133c2274

正如克雷克所说

do { /*...*/ }
until(-- p --->   second < 0);

相当于:

do { /*...*/ }
until(--((p--)->second) < 0);

这相当于:

do { /*...*/ } 
while(((p--)->second)-- > 0);

所以如果价值是0它也会打破。

于 2012-08-23T09:29:27.173 回答