vector
和deque
operator[]
的工作是否相同?如果没有,哪一个更快?
答案 0 :(得分:11)
std::vector<T>
是T
元素的平面数组。 std::deque<T>
是T
的大小相等的数组。索引访问的复杂性在两种情况下都是O(1),但std::deque<T>
需要做更多的工作来确定要访问的元素,并且还有一个指示。就像,std::deque<T>
上的迭代器需要进行多次检查(尽管算法可以优化这一点,主要是通过识别分段结构使开销相当小。因此,如果需要经常使用下标运算符std::deque<T>
可能是一个糟糕的选择,在前面插入/删除时std::vector<T>
中移动元素的成本可能会被抵消。
只是解释一下,std::deque<T>
在使用下标运算符时需要做的事情:可以考虑做这些操作:
T& deque<T>::operator[](size_t n) {
n += this->first_element;
size_t subarray = n / size_of_subarrays;
size_t index = n % size_of_subarrays;
return this->subarrays[subarray][index];
}
分区/模数运算符不太可能太昂贵,因为size_of_subarray
几乎肯定被选为2的幂,即它们基本上等于位操作。
答案 1 :(得分:1)
for deque
下载接近向量的效率
Bjarne Stroustrup“C ++编程语言”17.2.3
由于访问元素需要一个额外的间接,因此不完全相同。在许多情况下,由于高速缓存未命中而导致额外的存储器命中。因此,随机访问可能会降低数量级(实际上大约为1000倍)。但是,这将对许多连续访问进行摊销,因此在实践中通常不会那么糟糕。
答案 2 :(得分:0)
std::deque
类似于std::vectors
的列表,因此,如果您确实需要[]
运算符,std::vector
获取数据的速度会更快,但差异不大,因此,您应该更好地查看在后面和前面推送数据的频率,以确定您是否需要std::vector
或std::deque
。
还有一件事,如果您使用for循环来获取容器的某些索引,则应该更好地使用iterator
,因此从std::vector
和std::deque
获取数据的速度差异将不会引人注目。