我最近在看SGI STL的源代码。

而且我知道vector.push_back将调用insert_aux,并且insert_aux将调用copy_backward

void push_back(const T& x){
    ...
    insert_aux(end(),x);
}

void insert_aux(iterator position, const T& x){
    if (finish != end_of_storage) {
         ...
         ++finish;
         T x_copy = x;
         copy_backward(position, finish - 2, finish -1);
    }
    ...
}

在我的最后一句话中,据我所知,positionfinish - 1,那么当(位置>完成-2)时,如何调用back_backward

会发生什么?

最佳答案

您已经省略了重要的代码段。

void push_back(const Tp& x) {
    if (finish != end_of_storage) {
        construct(finish, x);
        ++_M_finish;
    }
    else
        insert_aux(end(), x);
}

仅在insert_aux时才在此处调用finish == end_of_storage。如果此条件是true,则在insert_aux内部采用另一个分支来分配新存储:
void insert_aux(iterator position, const Tp& x) {
    if (finish != end_of_storage) {
       ...
    } else {
        const size_type old_size = size();
        const size_type len = old_size != 0 ? 2 * old_size : 1;
        iterator new_start = allocate(len);
        iterator new_finish = new_start;
        new_finish = uninitialized_copy(start, position, new_start);
        construct(new_finish, x);
        ++new_finish;
        new_finish = uninitialized_copy(position, finish, new_finish);
        destroy(begin(), end());
        deallocate(start, end_of_storage - start);
        start = new_start;
        finish = new_finish;
        end_of_storage = new_start + len;
    }
}
insert_aux()中的第一个分支只是将尾部向右移动一个元素,从而为要插入的元素留出空位。这只有在我们有足够的空间容纳它时才能发生。

关于c++ - 在push_back中调用copy_backward会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59016106/

10-11 22:49
查看更多