通过类存储和更新矢量中的电流最小值

Storing and updating current minimum in vector through class

本文关键字:最小值 存储 更新      更新时间:2023-10-16

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

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

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

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

每当弹出 mindex 处的元素时,我也在运行updatemin()(定义如下):

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在执行这些函数时不包含正确的值。在返回mindex之前运行updatemin()将返回正确的值。可能是什么问题?

您在跟踪最小值方面遇到了一些问题。所有这些原因是您没有考虑到当您插入、删除等时最小值的索引实际上会发生变化:

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;
}

祝你好运

使用 std::min_elementstd::distance 一起获取最小索引:

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