我正在尝试实现一种数据结构,通过存储当前最小值,可以更快地获得向量中的最小元素。 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()
会返回正确的值。可能是什么问题?
答案 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_element
和std::distance
获取最低索引:
#include <algorithm>
//...
void cont<T>::updatemin()
{
mindex = std::distance(v.begin(), std::min_element(v.begin(), v.end()));
}