std::vector emplace_back 实现

lov*_*ode 2 c++ vector

我实现的push_back函数:

void push_back(T& num) {
    my_vec[index] = num;
    index++;
}
Run Code Online (Sandbox Code Playgroud)

还有 emplace_back 函数:

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

你觉得这有什么问题吗?如果是的话请告诉我

另外,请让我知道这是如何工作的?

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

Cal*_*eth 5

你觉得这有什么问题吗?

你并没有真正接受这个。还有任务呢

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

考虑到这一点,您可能应该push_back根据 来实现emplace_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)); }
}
Run Code Online (Sandbox Code Playgroud)

另外,请让我知道这是如何工作的?

template <typename... Args>允许零个或多个类型与此模板匹配,然后使用这些参数T(std::forward<Args>(args)...)构造 a , “完美转发”它们,即右值作为右值传递,左值作为左值传递。T

注意,因为std::vector没有new[],您无法实现与 C++ 20 之前的行为完全相同的东西因为std::vector它必须能够返回指向Tfrom数组的指针data,而无需构造T.