如何将数据传递到模板化集合

How to pass data to a templated collection

本文关键字:集合 数据      更新时间:2023-10-16

作为赋值的一部分,我必须编写一个类似C++向量的通用数据结构。

这是我对矢量的想法:

template<typename T>
class MyVector {
private:
    T* data_;
    size_t size_;
public:
    MyVector();
    MyVector(const MyVector &otherVector);
    // which one should I use?
    add(const T& value);
    add(T value);
    ~MyVector();
};

现在我想知道如何将值传递给方法。来自Java的我有点不知所措。在Java中,您会毫不犹豫地通过引用传递值,如果对象仍然被引用,GC永远不会删除它。

在C++中,如果你通过引用来考虑这样的代码,你会造成混乱:

void myFunction(MyVector &myVector) {
    int a = 5;
    myVector.add(a);
}
int main() {
    auto vector = MyVector<int>();
    myFunction(vector);
    // now the vector contains a reference to 
    // something that doesn't exist anymore.
}

你是如何解决这个问题的?您是通过引用传递并创建副本,还是通过值传递(为您创建副本)

看看C++std::vector接口,我发现它们使用了引用。

如果你必须创建自己的副本,我看不出通过引用传递的价值。

add(const T& value)是可以的,您只需要确保为T正确定义了赋值运算符。因此,实施将是:

void Add(const T& value) {
    if (m_size == m_maxSize) realloc(); // stuff to have enough space
    m_data[m_size++] = value; // here copy is creating
}

assign运算符的默认impl只是类的字节复制字段,它并不总是正确的。

如果您想要更多java风格的语义,另一种解决方案是使T = shared_ptr<YourType>T = YourType*后者相当困难,因为需要手动的寿命控制技能,所以对于c++初学者来说是不可取的。

void myFunction(MyVector<shared_ptr<X>> & myVector) 
{
    shared_ptr<X> x(new X(...));
    myVector.add(x);
}

工作原理类似于Java中的引用。另一种方式,在旧时代使用:

template<typename T>
class MyVector {
private:
    T** data_; // now you have array of pointers, so should be careful
....
    add(T* value);
....
}
void myFunction(MyVector<X> & myVector) 
{
    X * x = new X(...);
    myVector.add(x); // now x belongs to myVector and it should handle its lifetime
}