gpt4 book ai didi

c++ - std::vector emplace_back 实现

转载 作者:行者123 更新时间:2023-12-02 18:41:52 28 4
gpt4 key购买 nike

我实现的push_back函数:

void push_back(T& num) {
my_vec[index] = num;
index++;
}

和 emplace_back 函数:

template<class... Args>
void emplace_back(Args&&... args) {
push_back(T(std::forward<Args>(args)...));
}

你觉得这有什么问题吗?如果是,那么你能告诉我吗

另外,请告诉我这是如何工作的?

请注意:emplace_back 不是我的实现,我在寻找实现我自己的 emplace_back 的方法时从其他问题中获取了它。

最佳答案

Do you see any problem with this?

你并没有真正接受这个。还有作业。

std::vector<T> 分配 T 的数组.它使用 T 数组的大小和对齐方式分配原始内存。 ,然后实例化该原始内存中的对象。

考虑到这一点,您可能应该实现 push_backemplace_back 方面,而不是相反。

template <typename T>
class my_vector {
T * start;
std::size_t size;
std::size_t capacity;

void grow(); // Implementation of this is left as an exercise to the reader

public:
template <typename... Args>
reference emplace_back(Args&&... args) {
if (size == capacity) grow();
return *new (start + size++) T(std::forward<Args>(args)...);
}

reference push_back(const T & t) { return emplace_back(t); }
reference push_back(T && t) { return emplace_back(std::move(t)); }
}

Also, please let me know how does this work?

template <typename... Args>允许零个或多个类型匹配此模板,然后 T(std::forward<Args>(args)...)正在 build 一个 T有了这些论点,"perfectly forwarding"它们,即右值作为右值传递,左值作为左值传递。

注意因为std::vector没有 new[] ,你不能实现行为完全std::vector的东西在 C++ 20 之前,因为它必须能够返回指向 T 数组的指针来自 data无需构建 T 的数组.

关于c++ - std::vector emplace_back 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67900997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com