一、找到插入当前cost、mode要移动的步数
二、从待插入位置开始统一往后移一位,给待插入的cost和mode空出位置
三、插入当前cost和mode
四、返回插入的位置
uint32_t updateCandList(T mode, double uiCost, static_vector<T, N> &candModeList,
static_vector<double, N> &candCostList, size_t uiFastCandNum = N, int *iserttPos = nullptr)
{
CHECK( std::min( uiFastCandNum, candModeList.size() ) != std::min( uiFastCandNum, candCostList.size() ), "Sizes do not match!" );
CHECK( uiFastCandNum > candModeList.capacity(), "The vector is to small to hold all the candidates!" );
size_t i;
size_t shift = 0;
size_t currSize = std::min( uiFastCandNum, candCostList.size() );
//找到插入uicost要移动的步数
while( shift < uiFastCandNum && shift < currSize && uiCost < candCostList[currSize - 1 - shift] )
{
shift++;
}
//从待插入位置开始统一往后移一位,给待插入的cost和mode空出位置
if( candModeList.size() >= uiFastCandNum && shift != 0 )
{
for( i = 1; i < shift; i++ )
{
candModeList[currSize - i] = candModeList[currSize - 1 - i];
candCostList[currSize - i] = candCostList[currSize - 1 - i];
}
//插入当前cost和mode
candModeList[currSize - shift] = mode;
candCostList[currSize - shift] = uiCost;
if (iserttPos != nullptr)
{
*iserttPos = int(currSize - shift); //插入的位置返回给iserrPos
}
return 1;
}
else if( currSize < uiFastCandNum ) //若列表长度不足,直接扩充cost,mode列表(merge为6)
{
candModeList.insert(candModeList.end() - shift, mode);
candCostList.insert( candCostList.end() - shift, uiCost );
if (iserttPos != nullptr)
{
*iserttPos = int(candModeList.size() - shift - 1);
}
return 1;
}
if (iserttPos != nullptr)
{
*iserttPos = -1; //当前cost比cost列表中所有值都大,不更新cost列表,返回-1
}
return 0;
}