我需要存储最近的n个时间值,我使用一个向量来实现。当前方法可以工作,但是我的问题是,在长期运行中,向量将会填充,并且可能会耗尽内存,对吗?我正在使用一个浮点数的STL向量。
更明确地说:我正在从另一个进程推送时间值,我只需要最后5个时间值。
如何高效地实现这一点,而不让向量填满并最终耗尽内存?
我需要存储最近的n个时间值,我使用一个向量来实现。当前方法可以工作,但是我的问题是,在长期运行中,向量将会填充,并且可能会耗尽内存,对吗?我正在使用一个浮点数的STL向量。
更明确地说:我正在从另一个进程推送时间值,我只需要最后5个时间值。
如何高效地实现这一点,而不让向量填满并最终耗尽内存?
last = (last+1)%5;
确保找到一个好的方法来处理起始位置,如果数组中少于5个元素。如果你只是在开始时填充数组错误/中性值,那么应该没问题。
n
很大并且对象复制起来很昂贵,否则 std::vector
的性能优于 std::deque
。 - James Kanzestd::vector
的一个更小的常数因子意味着只有在有很多元素或它们非常昂贵时才会开始表现得比std::deque
更好。 - James Kanze我认为STL队列是你想要的。
我忘记了容器的名称 :) 我会使用std::queue容器。这样你就可以从序列的另一端删除,而不必担心位置。关于线程的问题...我想我无法帮助,但据我所知,向量和列表不是线程安全的。
4->5->6->7 //旧数据
5->6->7->8 //更新后
int arr[4]={0};
int count=0;
int head=0;
void insert(int data)
{
arr[count%4]=data;
count++;
if(count > 4)
head=count%4;
printf("count=%d head=%d\n",count,head);
}
void display()
{
int i;
for(i=0;i<4;i++)
{
printf("%d->",arr[(head+i)%4]);
}
printf("\n");
}
int item_at(int i)
{
return arr[(head+i)%4];
}
int main ()
{
int opt,data;
while(1)
{
printf("0. Exit\n1. Insert\n2. Display\n3. Item at\n");
scanf("%d",&opt);
if(opt == 0)
return 0;
else if(opt == 1)
{
scanf("%d",&data);
insert(data);
}
else if(opt == 2)
{
display();
}
else if(opt == 3)
{
scanf("%d",&data);
printf("arr[%d]=%d\n",data, item_at(data));
}
}
return 0;
}