成都网站建设cdcidi,wordpress博客主机选择,seo建站是什么意思,wordpress主题两边空白区域怎么添加图案如果写出vector这个类的时候不用缺省值#xff0c;也不用初始化列表 那么可以编写如下构造函数#xff0c;利用半缺省参数给没有初始化的vector实例进行赋空 但如果存在下面这两句话的设计 template class InputIterator vector(Inp… 如果写出vector这个类的时候不用缺省值也不用初始化列表 那么可以编写如下构造函数利用半缺省参数给没有初始化的vector实例进行赋空 但如果存在下面这两句话的设计 template class InputIterator vector(InputIterator first, InputIterator last) 则在调用的时候写下后面的代码vectorint v1(10, 1); 将不会调用vector(size_t n, const T val T()) 因为还要对10进行类型转换 编译器去找的时候会去找vector(InputIterator first, InputIterator last) 作为更匹配的构造函数因为其类型更匹配 所以实际上C标准库中将这种构造函数设计成 vector(size_t n, const T val T()); vector(int n, const T val T()); 这两个版本 想要支持 将字符数组 / 整型数组直接作为vector 的构造函数的实参 必须在initializer_listT 已经设计完毕的基础上 initializer_listT是一个类 其成员变量中有两个迭代器是数组的首尾指针 其成员函数中有size反映数组中的元素个数 注意 1. vectorint v1 { 1, 2, 3, 4, 5, 6, 7, 8 };这句话合法 合法的原因 在创建临时变量实例时vectorint tmp({ 1, 2, 3, 4, 5, 6, 7, 8 });合法 2. vectorint v1 { 1, 2, 3, 4, 5, 6, 7, 8 }; 看起来就像发生了隐式类型转换 类中的成员函数可以是一个模板函数 那么构造函数可以用一下的形式进行编写通过两个迭代器实现 注意下面的memcpy不能保证深拷贝 因为如果 此时vector中存放的都是string类型的变量 那么memcpy只会把_start中每个string的实例中的成员变量 依次赋值给tmp由于string的成员变量是:_arr; _size; _capacity 所以此时只会让tmp中的每个string实例中的成员和_start中的地址相同 那么对tmp 和_start进行析构时将会对同一块空间析构两次 所以应该使用自定义类型本身的赋值重载实现地址的深拷贝 如果用模板 迭代器的形式实现构造函数 那么迭代器可以将字符型指针作为迭代器传入到一个以int类型为内容的vector容器中 实际上C库中把 { 1, 2, 3, 4, 5, 6, 7, 8 }这种变量 直接封装成了一个类该类的类型为initializer_listint 即下面的代码中x 是initializer_listint 类型的变量 std::vectorint v1 { 1, 2, 3, 4, 5, 6, 7, 8 };这句话能执行 本质上是因为库中写了一个vector(initializer_listT arr);的构造函数 下面说明std::vectorint v1 { 1, 2, 3, 4, 5, 6, 7, 8 };这句话的执行过程 先利用{ 1, 2, 3, 4, 5, 6, 7, 8 }这个initializer_listint 类型的变量 执行vectorint tmp({ 1, 2, 3, 4, 5, 6, 7, 8 }); 调用vector中单参数的构造函数 产生一个vectorint类型的临时变量 再将调用 vector中的拷贝构造拷贝构造传入的形参就是这个临时变量 这也说明了在设计 拷贝构造 和 push_back 这样的成员函数时 需要对形参的类型加一个const限定 删除偶数 下面的程序加else是必须的这是因为迭代器不同域数组下标 执行erase方法之后会立马将后面的所有元素往前移动 那么此时如果要实现删除偶数只能通过it; 对于VS平台下其C库中要求只要使用了erase方法 要想继续使用iterator只能通过erase方法的返回值更新迭代器 此时VS下的erase方法将会返回当前删除的元素对应的迭代器 注意此时的迭代器不是指针不是指针这一点是和linux平台下是不同的