c++ - 在简单的向量类中复制数据
问题描述
我正在尝试编写自己的矢量类:
template <typename T>
class Vector {
public:
Vector(int default_size = 2) :
size(0), data_member(new T[default_size]), capacity(default_size) {};
Vector(const Vector& obj)
{
data_member = new T[obj.size];
data_member = obj.data_member;
size = obj.size;
capacity = obj.capacity;
}
void push_back(T& elem)
{
if (size == capacity)
resize(2 * size);
data_member[size] = elem;
size++;
}
void push_front(T& data)
{
if (size + 1 == capacity)
resize(2 * size);
for (int i = size - 1; i >= 0; i--)
{
data_member[i + 1] = data_member[i];
}
data_member[0] = data;
size++;
}
void pop_back()
{
--size;
}
void resize(int size_)
{
if (size_ > capacity)
{
T* temp = new T[size_];
memcpy(temp, data_member, size * sizeof(T));
delete[] data_member;
data_member = new T[size_];
data_member = temp;
//delete[] temp;
capacity = size_;
}
}
int get_size() { return size; }
T* getarr() { return data_member; }
private:
T* data_member;
int size;
int capacity;
};
这是测试我的课程的主要内容
int main()
{
Vector<int> myint;
int a = 5, b = 8, c = 9;
myint.push_back(a);
myint.push_back(b);
myint.push_back(c);
Vector<int> you = myint;
int* arr1 = you.getarr();
for (int i = 0; i < you.get_size(); i++)
{
cout << *arr1 << endl;
arr1++;
}
cout << endl << endl;
int h[3] = { 1,2,3 };
int* hp = h;
int g[3] = { 4,5,6 };
int* gp = g;
int f[3] = { 4,5,6 };
int* fp = f;
Vector<int*> myarrint;
myarrint.push_back(hp);
myarrint.push_back(gp);
myarrint.push_back(fp);
int** arr = myarrint.getarr();
for (int i = 0; i < myarrint.get_size(); i++)
{
for (int j = 0; j < 3; j++)
{
cout << **arr << endl;
(*arr)++;
}
arr++;
}
cout << endl << endl;
Vector<string> mystr;
string s1 = "I";
string s2 = "went";
string s3 = "shopping";
mystr.push_back(s1);
mystr.push_back(s2);
mystr.push_back(s3);
string* str1 = mystr.getarr();
for (int i = 0; i < mystr.get_size(); i++)
{
cout << *str1 << endl;
str1++;
}
cout << endl << endl;
string i = "wow";
mystr.push_front(i);
string* str2 = mystr.getarr();
for (int i = 0; i < mystr.get_size(); i++)
{
cout << *str2 << endl;
str2++;
}
cout << endl << endl;
return 0;
}
我是 C++ 的新手,我真的很困惑,我认为在我的push_back
函数中,我只是让我的对象指向temp
并且我没有在其中复制 temp ,所以如果我想在我的末尾删除 temppush_back
功能 my data_member
s 将丢失。那么这样做的正确方法是什么?
其次,如果我想创建一个string
s 的动态数组,我的程序有时会崩溃,我想,这是因为memcpy()
在我的resize
函数中,我仍然不知道我应该做什么来代替它?
解决方案
推荐阅读
- c# - 如何在我的单元测试中从原始 POST 请求中断言 StatusCode?
- javascript - 如何将 html 中的项目添加到 JavaScript 中的数组?
- google-kubernetes-engine - 允许在 gke 上的 kubernetes 网络策略中使用的 stackdriver ip 范围
- c# - 从字符串中检索货币符号
- asp.net - 为什么添加新实体只是为了修改另一个实体
- c# - 如何将我的代码分成各自独立的类?
- android - 使用 Android Q 的 DirectShare API
- r - rvest 中的 html_table 函数正在跳过一行
- c++ - 关于树遍历
- mongodb - 在 MongoDB 中查找某个用户的属性出现次数最多的值