复制 classvector:protected_Vector_base<_Tp,_Alloc>explicitvector(size_type __n):_Base(__n,allocator_type()){_M_finish=uninitialized_fill_n(_M_start,__n,_Tp());}template<class_Tp,class_Alloc>class_Vector_base{public:~_Vector_base(){_M_deallocate(_M_start,_M_end_of_storage-_M_st...
reserve扩容就是开辟新空间用memcpy将老空间的数据拷贝到新开空间中,假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题? int main() { bite::vector<bite::string> v; v.push_back("1111"); v.push_back("2222"); v.push_back("3333"); return 0; } 问题分析: memcpy...
//扩容 void reserve(size_t newcapacity) { //记录位置 size_t n = _finish - _start; T* tmp = new T[newcapacity]; //拷贝 //memcpy(tmp, _start, size() * sizeof(T)); for (size_t i = 0; i < size(); i++) { tmp[i] = _start[i]; } delete[] _start; _start = tmp...
假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题? 问题分析: 1memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存空间中 2如果拷贝的是自定义类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源...
1. memcpy是内存的二进制格式拷贝,将一段内存空间中内容原封不动的拷贝到另外一段内存空间中。 2. 如果拷贝的是内置类型的元素,memcpy既高效又不会出错,但如果拷贝的是自定义类型元素,并且自定义类型元素中涉及到资源管理时,就会出错,因为memcpy的拷贝实际是浅拷贝。
期间在介绍reserve的时候我们会介绍本文的第一个重点:memcpy/memmove导致的浅拷贝问题 在介绍insert和erase的时候我们会介绍本文的第二个重点:迭代器失效问题 二.具体实现 1.迭代器,begin,end 刚才说明了vector的迭代器其实就是指针类型,因此我们就可以这么来定义 ...
我们可以用for循环将memcpy进行替换来避免浅拷贝,造成程序崩溃 void push_back(const T& x) { if (_finish == _end_of_storage) { reserve(capacity() == 0 ? 4 : capacity() * 2); size_t sz = size(); size_t cp = capacity();
reserve扩容就是开辟新空间用memcpy将老空间的数据拷贝到新开空间中,假设模拟实现的vector中的reserve接口中,使用memcpy进行的拷贝,以下代码会发生什么问题? int main() { bite::vector<bite::string> v; v.push_back("1111"); v.push_back("2222"); ...
void reserve(size_t n) { size_t sz = size();//提前算出size()的大小,方便后续更新_finish if (n > capacity()) { T* tmp = new T[n]; if (_start)//判断旧空间是否有数据 { //不能用memcpy,因为memcpy是浅拷贝for (size_t i = 0; i < size(); i++) ...
可能你会想,当vector当中存储的是string的时候,虽然使用memcpy函数reserve出来的容器与原容器当中每个对应的string成员都指向一个字符串空间,但是原容器存储数据的空间不是已经被释放了,相当于现在只有一个容器维护这这些字符串空间,这还有什么影响。 但是不要忘了,当你释放原容器空间的时候,原容器当中存储的每个string...