CPP琐记 02

没写完,一点点补全吧,包括前面的内容,不定期编辑,老样子,只写难点

容器

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的时候就会导致引用失效)错误,以后有好的实例补上吧。

发表评论

邮箱地址不会被公开。 必填项已用*标注