通过类存储和更新向量中的当前最小值

时间:2015-04-12 23:17:03

标签: c++

我正在尝试实现一种数据结构,通过存储当前最小值,可以更快地获得向量中的最小元素。 v是一个向量,定义为cont类的私有变量。

向量中最小元素的索引存储在名为cont的{​​{1}}私有变量中。此类的默认构造函数将mindex初始化为0。

每当我插入新元素时,我都会更新最小值:

mindex

每当弹出void cont<T>::insert(const T & newItem, int index){ v.insert(v.begin() + index, newItem); if (newItem < v[mindex]) mindex = index; } 处的元素时,我也会运行updatemin()(在下面定义):

mindex

T cont<T>::pop_front(){ T elem = v.front(); v.erase(v.begin()); if (mindex == 0) updatemin(); return elem; } T cont<T>::pop_back(){ T elem = v.back(); v.pop_back(); if (mindex == v.size() - 1) updatemin(); return elem; } T cont<T>::remove(int index){ T elem = v[index]; v.erase(v.begin() + index); if (index == mindex) updatemin(); return elem; } 定义如下:

updatemin()

但是,void cont<T>::updatemin() { for (unsigned long i = 0; i < v.size(); ++i) if (v[i] < v[mindex]) mindex = i; } 在执行这些函数时不包含正确的值。在返回mindex之前运行updatemin()会返回正确的值。可能是什么问题?

2 个答案:

答案 0 :(得分:1)

你有一些跟踪分钟的问题。所有这一切的原因是你在插入,删除等时没有考虑到min的索引实际上发生了变化:

1-在插入函数中,您没有考虑如果在mindex之前的索引处插入新数字,那么mindex应该在比较之前递增:

void cont<T>::insert(const T & newItem, int index){ 
    v.insert(v.begin() + index, newItem);
    if (index < mindex) mindex++;
    if (newItem <= v[mindex]) mindex = index;    
}

2- pop_front:

T cont<T>::pop_front(){
    T elem = v.front();
    v.erase(v.begin()); 
    if (mindex == 0) updatemin();
    else mindex--;       
    return elem;
}

3-删除:

T cont<T>::remove(int index){
    T elem = v[index];
    v.erase(v.begin() + index);
    if (index == mindex) updatemin();
    else if (index < mindex) mindex--;   
    return elem;
}

祝你好运

答案 1 :(得分:0)

使用std::min_elementstd::distance获取最低索引:

#include <algorithm>
//...
void cont<T>::updatemin() 
{
    mindex = std::distance(v.begin(), std::min_element(v.begin(), v.end()));
}