0

我对指针比较陌生,并且已经编写了这个合并函数。这是对指针的有效使用吗?其次是*two变量,合并时不应该删除它吗?那将是客户的任务,而不是实施者?

VectorPQueue *VectorPQueue::merge(VectorPQueue *one, VectorPQueue *two) {
int twoSize = two->size();

if (one->size() != 0) {
    for (int i = 0; i < twoSize;i++)
    {
        one->enqueue(two->extractMin());
    }
}
return one;

}

交换函数是这样调用的

one->merge(one, two);

将这两个对象传递给它以合并

PQueue *one = PQueue::createPQueue(PQueue::UnsortedVector);
PQueue *two = PQueue::createPQueue(PQueue::UnsortedVector);
4

2 回答 2

4

在您的情况下,指针是完全没有必要的。您可以简单地使用引用。

也不需要传入调用成员函数的参数。this您可以使用指针获取调用成员函数的对象。

/// Merge this with other.
void VectorPQueue::merge(VectorPQueue& other) {
  // impl
}

一般来说:使用继承实现容器并不是真正的首选风格。查看标准库以及它如何在序列(迭代器)上实现抽象。

于 2013-01-11T20:15:00.233 回答
1

乍一看,我看不到任何与指针相关的问题。虽然我更喜欢使用引用,并创建merge一个成员函数,VectorPQueue所以我不必传递第一个参数(正如其他人已经指出的那样)。让我感到困惑的另一件事是检查- 如果为空one->size() != 0会有什么问题?one下面的代码仍然可以正确插入twoone因为它仅取决于two的大小。

关于删除two

那将是客户的任务,而不是实施者

好吧,这取决于你想如何设计你的界面。但由于该函数只将two' 元素添加到one,我会说它不应该删除它。顺便说一句,我认为这种方法的更好名称将是addAllFrom()或类似的名称。

关于一般指针

我强烈建议你看看智能指针。这些是 C++ 中用于减少内存管理工作的常用技术。使用裸指针并通过 new/delete 手动管理它们非常容易出错,很难保证异常安全,几乎可以保证你的内存泄漏等。另一方面,智能指针一旦不包含指针就会自动删除它们需要更多。出于说明目的,C++ 标准库具有auto_ptrunique_ptr并且shared_ptr如果您的编译器支持 C++ 11)。它是这样使用的:

{ // Beginning of scope
std::auto_ptr<PQueue> one(PQueue::createPQueue(PQueue::UnsortedVector));

// Do some work with one...:
one->someFunction();
// ...

} // End of scope - one will automatically be deleted

我个人的经验法则:只使用包裹在智能指针中的指针。只使用堆分配的对象,如果:

  • 它们的寿命必须比创建它们的范围更长,而且复制成本太高(幸运的是,C++ 11 具有移动语义,消除了很多此类情况)
  • 我必须在它们上调用虚函数

在所有其他情况下,我尝试尽可能多地使用堆栈分配的对象和 STL 容器。

如果您从 C++ 开始,所有这些一开始可能看起来很多,并且在您冒险使用智能指针等之前尝试完全理解指针是完全可以的(甚至可能是必要的)。但是它可以节省大量的调试时间上。我还建议阅读几本关于 C++ 的书——实际上,在我阅读第一本书之前,我一直以为我理解了 C++ 的大部分内容:)

于 2013-01-11T20:17:17.440 回答