gpt4 book ai didi

c++ - 编写 vector 类 C++

转载 作者:行者123 更新时间:2023-11-28 04:45:12 24 4
gpt4 key购买 nike

所以我正在尝试编写一个 vector 类,它可以在没有默认构造函数的情况下获取对象。为此,我使用了一个 raw 指针数组。事情是,当我实例化一个新 vector 时,我们称它为 2,基于先前的 vector ,我们称它为 1——它指向所述先前对象的基础地址 1。所以当我将一个新值插入到1、2 也更新了。

#ifndef MYVECTOR_MYVECTOR_H
#define MYVECTOR_MYVECTOR_H

#include <sstream>
#include <stdexcept>
#include <memory>
#include <vector>
#include <ostream>

template<typename T>
class MyVector;

template<typename T>
std::ostream& operator<<(std::ostream& out, const MyVector<T>& myVec){
out << "{";
for(int i = 0; i < myVec.numElem; i++){
out << &myVec.elements[i] << " ";
}
out << "}";
return out;
}


template<typename T>
class MyVector{
public:
int numElem;
int capacity;
T** elements;

MyVector(const unsigned int& numElements, const T& value) : numElem(numElements), capacity(numElements * 2){
elements = new T*[capacity];
for(int i = 0; i < numElem; i++){
elements[i] = new T(value);
}
}

template<typename U>
MyVector(const std::vector<U>& values): numElem(values.size()), capacity(values.size() * 2){
elements = new T*[capacity];
for(int i = 0; i < numElem; i++){
elements[i] = new T(values[i]);
}
}

void insert(const unsigned& pos, const T& value){
elements[numElem] = new T(*elements[numElem - 1]);
numElem++;

for(unsigned int i = numElem - 1; i > pos; i--){
elements[i] = elements[i - 1];
}
elements[pos] = new T(value);
}
};

#endif

根据评论 #1:

class NoDefault {
public:
NoDefault(const int& value) : value(value) {}

int value;
};

std::ostream& operator<<(std::ostream& out, const NoDefault& noDefault) {
out << noDefault.value;
return out;
}

int main() {
MyVector<NoDefault> noDefaultVec(std::vector<NoDefault>{7,8,9,10,11});
MyVector<MyVector<NoDefault>> vecvec(2, noDefaultVec);

std::cout << "noDefaultVec = " << noDefaultVec << std::endl;
std::cout << "vecvec = " << vecvec << std::endl;

noDefaultVec.insert(3, 99);
vecvec.insert(1, noDefaultVec);

std::cout << "noDefaultVec = " << noDefaultVec << std::endl;
std::cout << "vecvec = " << vecvec << std::endl;

return 0;
}

最佳答案

您执行的是浅拷贝而不是深拷贝。

vector 的浅表拷贝创建了一个新集合,该集合与旧集合共享元素。接下来,对原始对象所做的任何更改都会导致新对象发生更改。在这种情况下,您需要的是一个深拷贝,它复制从源到目标的每个元素。执行这样的复制后,您会得到两个具有单独数据集的 vector 。

为您的类提供复制构造函数可以解决问题,但您还应该记住基于The Rule Of Three 实现析构函数和赋值运算符。 .您还可以考虑添加移动构造函数和移动赋值运算符(或在 copy-and-swap idiom 之后添加一个赋值运算符)。

关于c++ - 编写 vector 类 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49378203/

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