复制哈希表的构造函数

时间:2015-12-28 04:18:34

标签: c++ copy hashtable

我在为哈希表编写复制构造函数时遇到问题。我已经遇到了仅包含链接对象的复制构造函数的问题。如何使用以下函数实现复制构造函数和赋值运算符:

//copy constructor
Apple::Apple(const Apple& anotherApple){


}

//assignment operator
Apple& Apple::operator = (const Apple& anotherApple){


}

我知道这将是:

tableSize = anotherApple.tableSize;
count = anotherApple.count;
array = new *anotherApple.array; //idk if this is right for dynamically created array of pointers

2 个答案:

答案 0 :(得分:1)

function redirect_to_customer($result = [], $redirect_url = "")
{
    $html = '<html xmlns="http://www.w3.org/1999/xhtml">
                <head></head>
                <body onload="closethisasap();">
                <form name="redirectpost" method="POST" action="' . $redirect_url . '">
        ';
    if (!is_null($result)) {
        $result = json_encode($result,true);
        $html .= '<input type="hidden" name="result" value="' . str_replace('"', "'", $result) . '"> ';
    }

    $html .= "
    </form>
    </body>
    <script type=\"text/javascript\">
        function closethisasap() {
            document.forms[\"redirectpost\"].submit();
        }
    </script>
    </html>";

    echo $html;
}

答案 1 :(得分:1)

理论上,您的复制构造函数可以在循环中编写,前提是从哈希表中检索并向哈希表添加值时存在正确的函数。如果这些函数目前不存在,那么无论如何你都要编写这些函数会更有价值,因为如果没有办法迭代所有的值,哈希表就会非常严格。

假设您有这样的功能,您可以在Node*函数中检索get。还假设getFirst()检索头节点,getNext()检索下一个节点,给定Node*值开始。复制构造函数看起来像这样:

Apple::Apple(const Apple& anotherApple)
{
    Node* curNode = anotherApple.getFirst();
    while (curNode)
    {
       addValue(curNode->key, curNode->value);
       curNode = anotherApple.getNext(curNode);
    }
}

这要求您的实现有一种方法可以使用getFirst()之类的东西获取表中的第一个值,并通过名为getNext()的函数迭代到当前节点的下一个条目。如果没有更多节点,则getNext()将返回NULL。

以这种方式编写复制构造函数的好处是,您可以重用希望已经过测试的代码,即addValue函数,而不必再次重写addValue。此外,几乎没有发生错误的可能性,因为您只是调用已存在的函数。

以这种方式编写复制构造函数的缺点是,runtiime方面的复杂性可能比尝试使用大量指针操作“从头开始”创建整个内部构件要慢(就像之前的答案之一那样) 。

所以权衡差异,安全超速。也许使用安全方法没有速度问题。

对于赋值运算符,如果你有一个工作副本构造函数和一个有效的析构函数,那么这就是你需要做的:

#include <algorithm>
//...
Apple& Apple::operator=(const Apple& anotherApple)
{
    Apple temp(anotherApple);
    std::swap(temp.array, array);
    std::swap(temp.tableSize, tableSize);
    std::swap(temp.count, count);
    return *this;
}

这使用copy / swap idiom。同样,这需要一个正确的复制构造函数和一个正确的析构函数(在这两个函数中没有任何错误)。