如何将数据传递到模板化集合
How to pass data to a templated collection
作为赋值的一部分,我必须编写一个类似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
}
相关文章:
- 防止主数据类型C++的隐式转换
- 处理多个异常集合的C++方法
- 用于循环访问多个集合的数据结构
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 只有Arduino的第一个对象在包含在另一个对象的集合/数组中时会丢失其数据属性值
- 用于访问集合c++的排序子集的数据结构
- 哪个集合/数据结构可以处理键、值、值
- 如何将数据传递到模板化集合
- 集合数据结构中的 end() 迭代器应该返回什么
- 具有前缀和后缀查询的字符串集合的数据结构
- C++在一个集合中存储多个数据类型
- 从自定义集合(struct Array)中读取数据
- 固件文件的容器:二进制数据部分的集合
- Lua vs嵌入式Lisp和潜在的其他候选.用于基于集合的数据处理
- 当需要修改元素时,另一种类似集合的数据结构是什么?
- boost是否有比STL更简单的用于集合操作的数据类型?
- 用于存储大量索引的数据结构,每个索引指向一个集合
- 获取指向集合中的原始数据的指针,例如 &(向量[0])
- 基于数据集合执行二叉树搜索
- 在集合 <string> A 和集合<string>B 的非交集中打印出数据