问题描述
我正在创建一个具有私有数据成员vector<list<pair<K,V>>> hashTable;
的哈希表。我的理解是,重新哈希函数应将原始表的元素分配给临时表,清空原始表,调整其大小,然后将临时表的元素哈希回原始表。
诸如vector<list<pair<K,V>>> tempTable = origTable;
之类的作业会进行深拷贝吗?还是我需要声明tempTable
的大小与原始表的大小相同,然后遍历每个索引的每个列表并将其添加到tempTable
?
最后,调用origTable.clear();
会清空每个索引中每个列表中的所有节点并正确回收内存吗?还是我需要浏览每个索引并显式清空每个列表中的信息?
谢谢
解决方法
C ++中的类型约定是具有复制语义的,并且std::vector
,std::list
和std::pair
都遵守这一点。
因此,vector<list<pair<K,V>>> tempTable = origTable;
进行了“深层复制”,并且不保留对旧数据的引用。同样,在这样的向量上调用.clear()
将破坏所有使用的内存。
vector<list<pair<K,V>>> tempTable = origTable;
所有内容都将从向量,列表中复制并配对,一直复制到K和V。但是,值得考虑的是,如果K和/或V本身是指针,则将复制该指针,但复制它们的对象指向不会,并且您将具有别名。
,是的。向量的复制分配很深。元素将被复制。
调用clear
将删除标准向量中的所有元素。所有这些对象均被销毁。标准迭代器的析构函数会销毁其所有节点。