C++ 是c+中的向量+;这么慢?

C++ 是c+中的向量+;这么慢?,c++,algorithm,vector,C++,Algorithm,Vector,我正在制作一个解决此问题的程序: 我使用向量的地方只有: for(int i =0;i < total_books; i++){ int temp; cin >> temp; books_order.push_back(temp); } for(int i=0;i>温度; 图书订单。推后(临时); } 及 for(int i=0;i>指数; 索引--; CUT< P>除非你已经调用了 Reals,将你的向量的大小与你所拥有的元素的大小相联系,调用 P

我正在制作一个解决此问题的程序:

我使用向量的地方只有:

for(int i =0;i < total_books; i++){
    int temp;
    cin >> temp;
    books_order.push_back(temp);
}
for(int i=0;i>温度;
图书订单。推后(临时);
}

for(int i=0;i>指数;
索引--;

CUT< P>除非你已经调用了<代码> Reals,将你的向量的大小与你所拥有的元素的大小相联系,调用<代码> PuthyBuff将在每次新的大小超过矢量容量时重新分配内存。考虑使用<代码> Reave为你的元素分配足够的内存,你应该看到性能加速,PA。如果向量很大,请特别注意其他关于使用
擦除

从向量中间移除元素(使用
vector::erase
)的答案。这是因为必须向下移动向量的所有较高元素,以填补已移除元素留下的空白


因此,这并不是说向量速度慢,而是因为选择了不合适的数据结构,导致算法速度慢。

如果您事先知道向量中有一定数量的元素,您可以保留足够的空间来容纳所有内容,以节省您在向量中重新分配空间:

books_order.reserve(total_books)
for(int i=0 ;i < total_books; ++i){
    int temp;
    cin >> temp;
    books_order.push_back(temp);
}
books\u order.reserve(图书总数)
对于(int i=0;i>温度;
图书订单。推后(临时);
}
但是,这不是问题所在,我相信如果您分析代码,您会看到
.erase()的开销很大从向量中间移除元素是很慢的,因为向量是如何实现的,它需要移动所有被移除的元素。考虑使用不同的数据结构来代替,例如<代码> STD::数组< /代码>。

IMO,罪魁祸首是它将在移除一个元素之后移动所有元素。因此,除非你总是删除最后一个元素,否则它可能会非常慢

我在vector中使用的唯一函数是vector::erase、vector::push_back和vector::begin

我想说这是你的问题。是
O(n)
,其他都是固定时间,不应该在在线判断问题中造成效率问题。避免擦除方法

但是,一般来说,如果您事先知道数组的大小,我只会使用一个简单的数组。如果您可以帮助的话,请不要添加任何不必要的开销

为解决您链接到的问题,请考虑使用A:它的擦除方法是“代码> O(log n)< /代码>,也就是它的插入方法。如果需要随机删除,这是您通常应该使用的。


<> > >编辑:我忘记C++了,所以也要看这些。既然你只关心这里的max,那么它可能比一个集合快,尽管它们都有相同的理论复杂性(堆可以<强>检索< /强> <代码> o(1)< /> >,但是删除它,你必须为这个问题做的是<代码>(logn)
)在这种情况下,任何一个都可以正常工作。

您真的需要一个向量来实现您正在做的事情吗

你必须记住向量是如何工作的:它们本质上是动态数组,当你在其中添加更多项时会调整大小。调整向量大小是一个O(n)操作(其中n是向量中的项数),因为它分配新内存并将项复制到新向量

你可以阅读向量擅长什么


我建议改用标准数组——这似乎完全合理,因为您已经知道总共有多少个元素(即
total\u books

您的问题是调用“擦除”。如果查看文档,您会注意到:

因为向量保持数组格式,所以在向量端以外的位置上进行擦除也会将段擦除后的所有元素移动到新位置,这可能不像在其他类型的序列容器(deque,list)中进行擦除那样有效


要么从循环的末尾开始运行循环,要么在循环结束后删除。

任何编程语言都可能被滥用……这不是向量的错。std::vector实际上是一个数组,需要更多空间时移动到新数组。如果向量必须以非常高的速度扩展,请尝试使用链接列表。您试图解决的实际问题是什么?我是relu我不想再鼓励你使用这些代码,但也许你会对另一种解决方案感兴趣。我不知道你的代码是如何解决这个问题的。这个问题中没有书,你确定链接正确吗?要解决你链接到的问题,你可能需要
std::make_heap
std::push_heap
std::pop_heap。指向问题的链接与代码无关。这将是第一个问题。我想指出的是,您需要一个更适合您的问题的不同数据结构,但事实是,首先您需要了解您需要解决的问题:)你让它听起来比实际情况更糟。大多数情况下,用向量替换数组不会给在线评委带来任何效率问题,因为向量的插入仍然是分期摊销的
O(1)
time。这里的问题是数组和向量数据结构不适合这个问题。由于向量擦除功能,我需要向量,这正是我需要解决的问题problem@A.06-不,不是。请看我的答案,使用集合。谢谢大家的回答,我将避免使用类似于vector::erase from的方法现在继续。@A.06:这不是避免给定方法的问题,而是知道绑定到容器的方法的复杂性的问题,这样您就可以为正确的任务选择正确的容器。对于这个问题,我建议
std::list
而不是
std::vector
std::set
变成有序的
books_order.reserve(total_books)
for(int i=0 ;i < total_books; ++i){
    int temp;
    cin >> temp;
    books_order.push_back(temp);
}