Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 保持向量中元素数不变_C++_Vector - Fatal编程技术网

C++ 保持向量中元素数不变

C++ 保持向量中元素数不变,c++,vector,C++,Vector,我正试图找出保持向量中元素数量恒定的最快方法(或者有一些现成的结构可以自动做到这一点) 在我的应用程序中,我正在向向量添加多个元素,我需要快速完成。由于vector在某一点上可以自行调整大小,因此它显著降低了总体应用程序速度。我想做的是这样的事情: if(my_vector.size() < 300) my_vector.push_back(new_element); else { my_vector.pop_front(); my_vector.push_back

我正试图找出保持向量中元素数量恒定的最快方法(或者有一些现成的结构可以自动做到这一点)

在我的应用程序中,我正在向向量添加多个元素,我需要快速完成。由于vector在某一点上可以自行调整大小,因此它显著降低了总体应用程序速度。我想做的是这样的事情:

if(my_vector.size() < 300)
    my_vector.push_back(new_element);
else
{
    my_vector.pop_front();
    my_vector.push_back(new_element);
}
if(my_vector.size()<300)
my_vector.push_back(新的_元素);
其他的
{
my_vector.pop_front();
my_vector.push_back(新的_元素);
}
但是在最初的几次测试之后,我意识到这可能不是最好的解决方案,因为我不确定
pop\u front()
和后来的
push\u back()
是否在某个时候仍然需要调整大小


有其他解决方案吗?

使用
std::queue
。它的底层容器是一个
std::deque
,但与堆栈一样,队列的接口专门用于FIFO操作(push_back,pop_front),这正是您在您的情况下所做的。以下是deque更适合这种情况的原因:

deque的存储会根据需要自动扩展和收缩 需要。deque的扩展比a的扩展更便宜 std::vector,因为它不涉及对现有 元素添加到新的内存位置

DEQUE上常见操作的复杂性(效率)如下 如下:

  • 随机存取-常数O(1)
  • 在末尾或开头插入或删除元素-常数O(1)

您只需
将容量保留到合理的数量即可。向量不会自动生成。因此,它只会增长,可能会在某个时候停止


您可能还对调整大小策略感兴趣。例如,Facebook进行了大量研究,并创建了自己的vector实现,该vector的性能优于
std::vector

要实现一个固定大小的容器,该容器具有后推和前弹出以及最小的内存混乱,请使用适当大小的
std::array
。要跟踪事物,您需要一个用于推送元素的前索引和一个用于弹出事物的后索引。要推送,请将元素存储在
front\u index
给定的位置,然后递增
front\u index
,并取容器大小的余数。要弹出,请在
back\u index
给定的位置读取元素,并以与
front\u index
相同的方式调整该索引。有了它,问题中的代码将满足您的需要。

IIRC当计数超过2的幂时,它将调整大小。如果您知道所需元素的大小,可以使用
std::array
。或者更好地使用和
std::deque
,它针对前/后插入/删除进行了优化,并在做任何事情之前始终检查
size()
。@Carlos因为在我的情况下,我有100个向量,即使一半的向量正在调整大小,这需要大量的时间。@GeorgeAl
std::array
在这里不是最好的,因为我知道我想要多少元素,但不知道我会有多少元素。至于
std::deque
我现在想起来,我可能会试试这个。如果我没有记错的话,如果我删除第一个元素,它将在下次从第二个元素开始读取-正确吗?请看一看,值得强调的是,
pop\u front
向量中是非常慢的操作。我们需要一个性能良好的结构。你的想法很有道理。非常感谢。