std::vector模板类对模板参数T的要求取决于在该容器上进行的操作,基本的,该类型要是完整类型并满足Erasable要求(所有标准库容器均要求其元素满足Erasable要求(可擦除要求))
Erasable指定该类型的对象能够以给定的分配器(Allocator)销毁。
接下来我们看下一些成员函数还有哪些更严格的要求。
首先,我们看下一些常见的更严格的要求都有哪些并分别是什么含义:
- MoveInsertable
- CopyInsertable
- DefaultInsertable
- EmplaceConstructible
其实这些就是要求分配器类型能正确的调用对应的初始化函数construct,以移动、拷贝、默认和就位构造元素。详见https://zh.cppreference.com/w...
1 emplace_back
必须满足MoveInsertable和EmplaceConstructible
2 resize(size_type count)
必须满足MoveInsertable和DefaultInsertable
3 resize(size_type count,const value_type& value)
必须满足CopyInsertable
4 push_back(const T& value)
必须满足CopyInsertable
5 push_back(T&& value)
必须满足MoveInsertable
注:2中的resize函数中,如果要求的大小比当前capacity还要大,那么需要申请新的内存,然后调用移动或拷贝构造函数将前面已经构造好的元素逐个移动或拷贝过去,这些函数的选用优先级:noexcept移动构造函数、复制构造函数、非noexcept的移动构造函数。
注:这里涉及到resize函数的异常安全性的保障,所以要求noexcept的移动构造函数。
如果你想要放在vector中的元素类型是不可复制也不可移动的(std::mutex)就很僵硬了,这意味着大部分必要的成员函数无法使用。这种情况建议加一层间接层:
std::vector<std::shared_ptr<std::mutex>> muts_;
然后在初始化vector数组时使用循环完成:
for(size_t i = 0; i<20; ++i) {
muts_.emplace_back(new std::mutex());
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。