首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >push_back和pop_back的实现

push_back和pop_back的实现
EN

Stack Overflow用户
提问于 2016-06-06 17:53:05
回答 1查看 1.7K关注 0票数 2

我想了解std::vector<T>::push_backstd::vector<T>::pop_back是如何在分配的内存中创建和销毁对象的?

我使用了google,我发现人们只是使用sizecapacity来限制对内部动态数组的访问,但我认为这并不是标准实现中真正的工作方式

注意:,我不要求标准实现,因为它很复杂,但是我希望能为这种方法提供一个基本的实现

编辑:我想出了如何实现我自己的自定义分配器

为了简单起见,我将只展示自定义分配器之外的重要功能

代码语言:javascript
复制
template <typename T>
T* allocate(std::size_t count) {
    return static_cast<T*>(::operator new(count * sizeof(T)));
}

template <typename T>
void deallocate(T* ptr, std::size_t count) {
    operator delete(ptr);
}


template <typename U, typename... Args>
void construct(U* ptr, Args&&... args) {
    new(ptr) U(std::forward<Args>(args)...);
}

template <typename U>
void destroy(U* ptr) {
    ptr->~U();
}

然后,在我自己定义的向量中使用,如下所示

代码语言:javascript
复制
int* buff = allocate<int>(8);
// This is like:
// std::vector<int> vec;
// vec.reserve(8);

int* last = &buff[0];
construct<int>(last, 32);
// This is like:
// vec.push_back(32);

++last;
construct<int>(last, 12);
// This is another push
// vec.push_back(12);

destroy(last);
--last;
// This is like: 
// vec.pop_back();


deallocate(buff, 8);
// This shoud be in:
// ~vector();

如果漏掉了什么..。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-06 18:31:18

所有带有分配器的标准容器都在使用分配器来构造或销毁元素:

23.2.1 3一般集装箱要求(N4296)

对于声明allocator_type的受此子子句影响的组件,存储在这些组件中的对象应使用allocator_traits::construct函数构造,并使用allocator_traits::destroy函数销毁。

标准库中的默认分配器是使用新位置来构造和调用析构函数来销毁元素:

20.7.9 11和12默认分配器(N4296)

代码语言:javascript
复制
template <class U, class... Args>
void construct(U* p, Args&&... args);

影响::新的((void *)p) U(std::forward(Args).)

代码语言:javascript
复制
template <class U>
void destroy(U* p);

效应: p-> ~ U()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37663859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档