在列表向量上调用 clear() 会清除列表中每个索引处的所有节点吗?

Will Calling clear() on a vector of lists clear all the nodes in the list at each index?

我正在创建一个具有私有数据成员 vector<list<pair<K, V>>> hashTable; 的散列 table。我的理解是,rehash 函数应该将原始 table 的元素分配给临时 table,清空原始 table,调整它的大小,散列临时 [=23] 的元素=]回到原来的table.

vector<list<pair<K,V>>> tempTable = origTable; 之类的赋值会进行深拷贝吗?或者我是否需要声明 tempTable 与原始 table 大小相同,然后遍历每个索引处的每个列表并将其添加到 tempTable

最后,调用 origTable.clear(); 会清空每个列表中每个索引处的所有节点并正确回收内存,还是我需要遍历每个索引并显式清空每个列表?

谢谢

C++ 中类型的约定是具有复制语义,std::vectorstd::liststd::pair 都遵循这一点。

因此 vector<list<pair<K,V>>> tempTable = origTable; 执行 'deep copy',并且不保留对旧数据的引用。并且类似地在这样的向量上调用 .clear() 将破坏所有使用的内存。

是的。 vector 的复制赋值很深。将复制元素。

调用clear 将从标准向量中删除所有元素。所有这些对象都被销毁了。标准迭代器的析构函数会销毁它的所有节点。

vector<list<pair<K,V>>> tempTable = origTable;

一切都会复制,从向量、列表和对一直到 K 和 V。但是,值得考虑的是,如果 K and/or V 本身是指针,那么指针将被复制但是他们指向的对象不会,你会有别名。