在push_back拨打copy_backward时会发生什么?
What happen when call copy_backward in push_back?
我最近在看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);
}
...
}
在最后一句话中,据我了解,position
是finish - 1
,那么它怎么能调用back_backward
时(位置>完成 - 2(?
会发生什么?
您省略了重要的代码片段。
void push_back(const Tp& x) {
if (finish != end_of_storage) {
construct(finish, x);
++_M_finish;
}
else
insert_aux(end(), x);
}
只有当finish == end_of_storage
时,才会在此处调用insert_aux
。如果此条件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()
中的第一个分支只是将尾部向右移动一个元素,以便为要插入的元素腾出一个空位。这只有在我们有足够的空间容纳它的情况下才会发生。
完成指向最后一个元素的旁边。在insert_aux函数中,递增完成后,位置为完成-2。因此copy_backward位置+1从一个位置复制到另一个位置。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用