没写完,一点点补全吧,包括前面的内容,不定期编辑,老样子,只写难点
容器
Vector,犹豫不决就用它,其实这玩意大概是个可变长的数组(我现在还没看过STL的源码)?看起来以后可以试着实现一下。
猜猜cpp书上说的,当没有默认构造函数的对象用作Vector初始化的情况会怎么样?
class Test{
private:
int a;
public:
Test(int a) : a(a){}
};
std::vector<Test> v1(10);
IDE语法提示正常, 编译时:
no appropriate default constructor available
不难理解为什么不能这样初始化,但书上的例子实在太抽象了。
实际上对应:
explicit vector( size_type count, const T& value = T(), const Allocator& alloc = Allocator()); | (until C++11) |
vector( size_type count, const T& value, const Allocator& alloc = Allocator()); |
std::vector<Test> v1(10, 1);
这样就可以了~
以下代码分别是什么类型(cpp 9.10)
vector<int> v1;
const vector<int> v2;
auto it1 = v1.begin(), it2 = v2.begin();
auto it3 = v1.cbegin(), it4 = v2.cbegin();
其实他想考你迭代器的类型是跟着容器类型走的,但其实这代码根本编译不过去(clang,gcc都不行),检查阶段就已经被发现了。
正确的:
auto it1 = v1.begin();
auto it2 = v2.begin(), it3 = v1.cbegin(), it4 = v2.cbegin();
push与emplace
目前的理解是,适当的情况下使用 emplace可以提升性能,调用push的时候会在栈上创建一个临时的对象, 因此又要构造又要调用拷贝和移动函数,emplace则是直接调用构造函数,不需要额外的拷贝和移动的成本,当然也不排除有些场景下会导致(比如引起vector发生内存重新分配,这样传入一个引用来emplace的时候就会导致引用失效)错误,以后有好的实例补上吧。