如何将矢量列表中的对象复制到另一个矢量列表?

时间:2011-04-07 06:06:44

标签: c++ stl vector

我喜欢将第一个向量的对象复制到第二个向量,但是当我删除第二个向量时,第一个向量内容不应该更改。 我怎么能这样做?

CODE:

typedef vector<CLog*> CLogData;

CLogData CMultiThreadedDlg::CopyLogData()
{
CLogData logdata;
for(size_t i = 0; i < m_pThreadInfo->GetLog().size()-1; ++i)
{
  CLog* plog = new CLog(*m_pThreadInfo->GetLog()[i]);
  logdata.push_back(plog);
}
return logdata;
}

DeleteData(logdata); 

void CMultiThreadedDlg::DeleteData(CLogData tLogData)
{
for(size_t i = 0; i < tLogData.size()-1; ++i)
{
    CLog* log = (CLog*)tLogData[i];
    delete log;
}

tLogData.clear();
 }

我的代码中的问题是,在删除第二个向量时,第一个向量即 m_pThreadInfo-&gt; getLog()内容也被删除..

如何克服这个问题?

编辑:

     CLog::CLog()
     {
        m_threadname = new char[20];
     }
     CLog::~CLog()
     {
           delete[ ] m_threadname;
     }

如果我使用CLog作为矢量列表的参数..我可以删除这个..

...谢谢

2 个答案:

答案 0 :(得分:4)

哦,伙计。你的代码中有一些严重的问题。

首先,你有

class CLog
{
    char* m_threadname;

public:

    CLog()
    {
        m_threadname = new char[20];
    }

    ~CLog()
    {
        delete[ ] m_threadname;
    }
};

这是C ++而今年是2011年,请不要这样做。如果你这样做,不要声称性能是一个原因。相反,这样做:

class CLog
{
    std::string m_threadname;
};

请参阅!

其次,您使用指针元素复制向量,并在删除第二个向量元素时第一个向量元素消失时感到惊讶。你知道,它是相同的元素。向量只是一个容器,而不是所有者。作为程序员,您拥有这些元素。矢量只是拥有它们。

您可以使用

typedef vector<shared_ptr<CLog>> CLogData;

解决您的问题。或者,最好是

typedef vector<CLog> CLogData;

除非另有证明,否则更好。你没有充分说明为什么这是一个坏主意。

使用堆栈,这是你的朋友。

修改

此外,您需要按顺序获取参考。在

void CMultiThreadedDlg::DeleteData(CLogData tLogData)
{
    for(size_t i = 0; i < tLogData.size()-1; ++i)
    {
        CLog* log = (CLog*)tLogData[i];
        delete log;
    }

    tLogData.clear();
}

您将矢量复制传递给DeleteData,副本将为.clear() - ed,而不是原始版本。可能是危险的,如果它挂起来,你认为它有有效的指针,它没有。

答案 1 :(得分:2)

通过vector<CLog*>,程序变得不必要地变得复杂。我建议您使用vector<CLog>代替vector<CLog*>。通过该修改,您无需担心明确删除向量的内容。您可以使用赋值运算符将一个向量的元素复制到另一个向量。


关于向量的赋值操作的注释 -

#include <vector>
#include <iostream>

using namespace std;

int main()
{
    foo obj(10) ;

    vector<int> a(5), b(5) ;
    for( int i=0 ; i<5; ++i )
        a[i] = i ;

    b = a;  // Assignment 

    cout << b[2] << "\t" << a[2] << "\n";

    b[2] = 25;

    cout << b[2] << "\t" << a[2] << "\n";

    return 0 ;
}

输出:

  

2 2
  25 2

看到修改向量b不会影响a。因此,如果类型为CLog,则您的注释不正确,分配操作也会修改其他向量。

由于该类具有元素char*,因此赋值操作不会执行深层复制。请改用std::string