STL vector 原理及应用
初学C++的时候,便喜欢上用vector来代替一般的数组,因为vector不像一般数组那样死板,其长度是可变的,还有许多内置的方法,操作起来很方面。
vector的内部机制
vector可以理解为,动态分配的元素数组。源代码中的定义如下:
template<class _Ty,
class _Ax>
class vector
: public _Vector_val<_Ty, _Ax>
{ // varying size array of values
public:
/********/
protected:
pointer _Myfirst; // pointer to beginning of array
pointer _Mylast; // pointer to current end of sequence
pointer _Myend; // pointer to end of array
};
vector是线性连续存储,用三个指针去管理该连续内存。具体的内部实现机制可以参考这篇文章STL vector的内部实现原理及基本用法
emplace_back VS push_back
一般vector最常用的插入和删除方法是push_back
和 pop_back
。
但是我在刷leetcode的时候,发现某些大神是用emplace_back
来代替push_back
要区分emplace_back
和push_back
的区别,就要先理清C++中左值
和右值
的区别
左值和右值
-
左值:lvalue,可以放在等号左边的值,现在被重新解释为location,可以理解为某已知的内存区域。
-
右值:rvalue,放在等号右边的值。与左值相反,是不可知的区域
在有些文章中,还有以下表述
- 左值 :表达式结束后依然存在的持久对象。
- 右值 :表达式结束后就不再存在的临时对象。
例如:
int foo;
foo = 1;
上述代码中,foo
是左值
int foo(){
return 1;
}
int main(){
foo() = 2
}
上述代码是错误的,因为函数foo的返回值是临时变量,不可以作为左值,但是可以作为右值。
emplace_back效率高
首先需要明确的是,emplace_back
的效率比push_back
高。emplace_back
的最大优势是它可以直接在vector的内存中去构建对象,不用在外面构造完了再copy或者move进vector中。
Reserve vs Resize
其实平时用的最多的是resize
方法,其作用是改变size=_Mylast - _Myfirst
而reserve方法是用来改变capacity=_Myend - _Myfirst
Reference
[emplace_back VS push_back](