C++ 使用while的条件赋值

C++ 使用while的条件赋值,c++,optimization,C++,Optimization,我一直在研究一些代码(为了扩展它),我遇到了以下部分: // 'assignList' is an unsigned int array: "unsigned int assignList[ numElements ]" // 'postAssignList' is a std::vector< unsigned int > for ( unsigned int pp; pp < numElements; ++pp ) { while( assignList[pp] !

我一直在研究一些代码(为了扩展它),我遇到了以下部分:

// 'assignList' is an unsigned int array: "unsigned int assignList[ numElements ]"
// 'postAssignList' is a std::vector< unsigned int >
for ( unsigned int pp; pp < numElements; ++pp )
{
    while( assignList[pp] != postAssignList[ assignList[pp] ] )
    {
        assignList[pp] = postAssignList[ assignList[pp] ];
    }
}
/'assignList'是一个无符号整数数组:“无符号整数assignList[numElements]”
//“postAssignList”是一个std::vector
for(无符号整数pp;pp

我不明白为什么一个
while
循环被用于条件赋值。这是一种优化技术吗?或者它确保了赋值(我认为是有保证的)?

这根本不是一个条件赋值,这是一个简单的迭代。更改
assignList[pp]
的值会导致
postAssignList[assignList[pp]]
的更改。这看起来像一个列表遍历

while( x != Next[ x ] )
{
    x = Next[ x ];
}
在执行
for
循环之前,每个
assignList[pp]
都指向一个由自循环终止的链表


执行后,每个
assignList[pp]
都指向初始列表的尾部元素。

这看起来像是一种优化技术,因此如果
assignList[pp]
已经持有该值,则不会赋值。不过,我不确定这项技术是否值得,因为您只是使用了一个条件赋值,可能是一个赋值,而不是一个直接赋值。将此视为
循环也很奇怪;通常,这种优化显示为
if
。就我个人而言,我会回避这样的事情,尽管可能有更有经验的人会不同意。@computerfreaker:如果一个普通的
人做这项工作,他不会吗?我认为,
的开销更大@哈罗德:不,这个代码经过了严格的同行评审。虽然可能,但可能性很小。assignList[pp]可能会更改,因此在后续迭代中赋值可能会有所不同。这是一个真正的、非平凡的算法,它执行一些索引置换-循环完全按照它所说的那样执行。顺便说一句,如果(a!=b)a=b,则使用条件赋值,例如
if(a!=b)将完全没有效率
a=b。测试比分配成本更高,而且只在一小部分情况下保留了分配,但整个过程都在
for
循环中。因此,对于
pp
的特定值
assignList[pp]
postAssignList[assignList[pp]]
的值将是“常量”。那么为什么我需要一个
while
循环来进行条件检查呢?(或者我是瞎了,错过了什么明显的东西?)是的,你是瞎子。
pp
保持不变并不重要,
assignList[pp]
会改变。让
assignList[9]==0
postAssignList[0]==1
postAssignList[1]==2
postAssignList[2]==2
assignList[9]
将被赋值
1
,然后
2
。噢,我现在明白了!可悲的是,需要一些人的帮助才能到达那里:(非常感谢,伊夫!