矢量vs Deque运算符[]

时间:2013-09-15 11:40:10

标签: c++ vector deque

如果我们不断在容器的前面和后面添加,那么将选择Deques作为vector。但是,这是什么? vectordeque operator[]的工作是否相同?如果没有,哪一个更快?

3 个答案:

答案 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::vectorstd::deque

还有一件事,如果您使用for循环来获取容器的某些索引,则应该更好地使用iterator,因此从std::vectorstd::deque获取数据的速度差异将不会引人注目。