C++自己的对象堆栈.在 push() 上复制了什么?
C++ own Stack of objects. What is copied at push()?
好吧,我在类中实现了一个FIFO堆栈(push,pop(堆栈,其中分配了mem整数。 所以我问自己:如果"int"是一个数据类型,为什么我不能将"ADT"推送到我自己的堆栈。
然后我带来了这段代码:
#include <iostream>
class Person {
std::string name;
int age;
public:
Person(std::string pName = "", int pAge = 1)
{
name = pName;
age = pAge;
}
void Print()
{
std::cout << name << " " << age << std::endl;
}
};
class Stack {
Person * stack;
int size, top;
int index;
public:
Stack(int stackSize)
{
top = stackSize -1;
index = top;
stack = new Person[stackSize];
}
void push(Person person)
{
if (index < 0)
std::cout << "Stack UNDERFLOW" << "Index is: " << index << std::endl;
stack[index--] = person;
}
Person & pop()
{
if (index > top)
{
std::cout << "Stack OVERFLOW" << std::endl;
}
return stack[++index];
}
};
我知道,STL 库中有堆栈、队列、vectos 等。我只是想自己做。 我希望堆栈推送对象的副本。 我不确定我不知道编译器是否在推送地址,复制整个对象(我想要什么(或什么。
请启发我。
这是我的主((代码:
int main()
{
Stack stack(100);
Person person("Lucas", 39);
for (int i = 0; i < 100; i++)
{
stack.push(person);
((Person)stack.pop()).Print();
}
return EXIT_SUCCESS;
}
要回答您关于副本的问题,请:
stack[index--] = person;
创建副本,因为作业两面的类型均为T
类型。
这:
stack.push(person);
还会复制,因为您正在按值传递person
。 若要避免此(冗余(副本,请将push
声明为:
void push(const T &person)
好吧,我为解决我的问题所做的就是@PaulMcKenzie在他的评论中所说的。 我为"堆栈"类创建了一个模板,任何模板"T"都是传递给这个类的数据类型。 关于主要方法(在我的问题中(,它对(人(有一个不必要的投射,因为它是暗示的。 编辑 2: @Paul桑德斯也是对的,我在push((上做了一个冗余的副本
这样我解决了我的问题:
#include <iostream>
class Person {
std::string name;
int age;
public:
Person(std::string pName = "", int pAge = 1)
{
name = pName;
age = pAge;
}
void Print()
{
std::cout << name << " " << age << std::endl;
}
};
template <class T>
class Stack {
T * stack;
int size, top;
int index;
public:
Stack(int stackSize)
{
top = stackSize -1;
index = top;
stack = new T[stackSize];
}
void push(const T &person)
{
if (index < 0)
std::cout << "Stack UNDERFLOW" << std::endl;
stack[index--] = person;
}
T pop()
{
if (index > top)
{
std::cout << "Stack OVERFLOW" << std::endl;
}
return stack[++index];
}
};
int main()
{
Stack<Person> stack(100);
Person person1("Lucas", 39);
Person person2("Gustavo", 38);
for (int i = 0; i < 100; i++)
{
if (i % 2 == 0)
stack.push(person1);
else
stack.push(person2);
}
for (int i = 0; i < 100; i++)
stack.pop().Print();
return EXIT_SUCCESS;
}
在 main(( 函数的示例中,它创建了一个 100 的 Person 对象堆栈。然后我创建 2 个人:"卢卡斯"和"古斯塔沃"并将其插入我的堆栈 100 次(第一次用于语句(。 然后第二个也是最后一个语句 pop(( 所有值并打印出来。
相关文章:
- 文件系统:复制功能的速度秘诀是什么
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 移动语义和深层/浅层复制之间有什么关系?
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- C++自己的对象堆栈.在 push() 上复制了什么?
- 将复制构造函数设置为private和=delete有什么区别
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 尝试使用 Qt 库中的 QPixmap 将图像拆分为多个块。关于他的复制方法的工作方式,我有什么不明白的吗?
- 在复制构造函数中使用和不使用 const 有什么区别
- 在复制构造函数中放入什么 = 运算符重载
- 不能让类是微不足道的可复制的。我做错了什么?
- 使用 c++ 复制函数有什么问题
- 如果strncpy将随机数据复制到缓冲区中会发生什么
- 这个奇怪的复制构造函数错误抱怨的是什么
- 复制构造函数实际做什么
- 从外部 VM 复制特定数据的最佳方法是什么?
- 如果复制构造函数所做的一切都可以使用"="来完成,那么它有什么用?
- 在 vector 的复制/移动分配下,底层存储会发生什么情况?