将类成员向量的内容复制到另一个向量中,然后将它们交换回来

Posted

技术标签:

【中文标题】将类成员向量的内容复制到另一个向量中,然后将它们交换回来【英文标题】:Copy contents of a class member vector into another vector and then swapping them back 【发布时间】:2015-02-06 02:14:40 【问题描述】:

所以我有以下格式的两个类:

class HashMinHeap 
private:
    vector<int> MiniHeap;
public:
  ...
];

class HashTable 
private:
    vector<HashMinHeap*> table;

public:
...
;

我想创建第二个向量vector &lt;HashMinHeap*&gt; table2,将table的内容复制到table2,然后我将对table进行一些操作,最终将删除table的内容,所以为了保留它的内容,我想将原始内容从table2back 换回table。有人知道如何进行复制和交换吗? 谢谢! 注意 当我进行复制和交换时,table 中包含 HashMinHeapobjects。

【问题讨论】:

不明白。你想对你的向量做一些时髦的可变操作,但又不想失去它的内容?为什么不直接复制它并对副本进行可变操作?此外,当您复制vector of pointers 时,请注意该向量只会进行浅拷贝。换句话说,副本仍将指向相同的指针(相同的HashMinHeap 对象)。 如何正确制作副本,使副本上的可变操作不会破坏原件? 你为什么使用vector to pointers?为什么不只是vector&lt;HashMinHeap&gt; table?在这种情况下,该向量的完整副本就像vector&lt;HashMinHeap&gt; myFullCopy = table; 一样简单。你使用vector to pointers 可能有一个很好的理由,如果你能解释一下,那就太好了。对我来说非常不清楚的另一件事是为什么你要复制一些对象,修改它,然后把它扔掉?您要解决的更大问题是什么? 我想要一种方法来跟踪向量中的空槽,方法是让槽指向 NULL。有更好的方法吗? 我的任务是为冲突结果创建一个带有单独链接的哈希表。但是,链接必须是最小堆实现。我已经有一个函数,deleteMin,它找到最小的元素,然后从数据结构中删除它。现在我想按升序打印所有元素,所以我想重用我的 deleteMin 函数,但也要保留数据结构的内容。 【参考方案1】:

关于“如何深度克隆vector of pointers”的问题

使用复制构造函数,如下所示。

#include <iostream>
#include <vector>

using namespace std;


class HashMinHeap 
public:
    string s;
    vector<int> MiniHeap;

    HashMinHeap()  

    HashMinHeap(const HashMinHeap& other ) : MiniHeap(other.MiniHeap), s(other.s)  
;

class HashTable 
public:
    vector<HashMinHeap*> table;

    HashTable()  

    HashTable(const HashTable& other ) 
        for(auto& item : other.table) 
            table.push_back(new HashMinHeap(*item));
        
    
;

int main(int argc, const char * argv[]) 
    HashTable table;
    table.table.push_back(new HashMinHeap);
    table.table.push_back(new HashMinHeap);
    table.table[0]->s = "Hello world....";
    table.table[1]->s = "Hello universe....";

    HashTable tableCopy = table;
    tableCopy.table[0]->s = "Changed....";

    cout << "original1 " << table.table[0]->s << endl;
    cout << "original2 " << table.table[1]->s << endl;
    cout << "copy " << tableCopy.table[0]->s << endl;
    cout << "copy2 " << tableCopy.table[1]->s << endl;
    return 0;

结果

original1 Hello world....
original2 Hello universe....
copy Changed....
copy2 Hello universe....

【讨论】:

以上是关于将类成员向量的内容复制到另一个向量中,然后将它们交换回来的主要内容,如果未能解决你的问题,请参考以下文章

c++ 将类成员推送到向量的正确方法

以相反的顺序将一个向量复制到另一个向量

如何将一个向量复制到另一个向量的末尾? [复制]

如何在 C++ 中将一个对象从一个向量复制到另一个向量?

将一个向量拆分为几乎相等的子向量,然后存储到另一个向量中

C ++:在向量中插入啥 - 指针或引用,向量何时复制它的元素?