2012-08-20 3 views
6

私は(他の多くのものの中で)削除され、別の配列のデータを格納するために再割り当てされるunsigned charへのポインタを持つクラスを持っています。これは私がすべてで、このコードのようにいけない機能どのようにして、生の配列からstd :: vectorに相当するmemcpyを行うことができますか?

class MyClass { 
    private: 
     unsigned char* m_Buffer; 
     int m_BufferSize; 
    public: 
     bool SetBuffer(int iSize, const unsigned char* pArray); 
}; 

bool MyClass::SetBuffer(int iSize, const unsigned char* pArray) { 
    bool bOK = false; 
    if (pArray != NULL && iSize > 0) { 
     delete [] m_Buffer; 
     m_Buffer = new unsigned char[iSize]; 
     memcpy(m_Buffer,pArray,iSize); 
     m_BufferSize = iSize; 
     bOK = true; 
     } 
     return bOK; 
    } 

で行われ、私は本当にstd::vector<unsigned char>でポインタを交換したいと思います。私の質問は、私はどのようにmemcpyのアスペクトを実行するのですか?私の関数に引数としてベクトルを渡していた場合は、イテレータを使ってコピーすることができますが、パラメータ引数の型を制御することはできませんので、unsigned char*がついています。イテレータを使用する方法、またはベクトルのサイズを正しいサイズに変更して内部配列にアクセスする方法はありますか?memcpyでデータをコピーすることはできますか?またはイテレータを使用した方が良いでしょうか?私はループとpush_backを使用することができることを知っているが、それは私にとって痛いほど非効率なようだ。どんな提案も感謝して受け取ります。

答えて

19

実際、イテレータはポインタからモデル化されているため、配列内のポインタはRandomAccessIteratorという概念を実装すると見なされます。したがって

は:

m_buffer.assign(pArray, pArray + Size); 
+0

+1ベストソリューション –

+0

これはベクターのサイズを自動的に変更するか、クリアするためにサイズを配列のサイズに設定する必要がありますか? – mathematician1975

+0

@ mathematician1975 [こちら](http://en.cppreference.com/w/cpp/container/vector/assign)を参照してください。あなたは、明確に、サイズを変更するか何かを呼び出す必要はありません。 – juanchopanza

0

私は実際に生のポインタをこのように回避するために、あなたをお勧めします。私は、生ポインタの代わりにstd :: vectorsを管理することをお勧めします。

あなたはコピーコンストラクタでこのポインタの世話をして operator =(またはその代わりにそれを取り除く)になるあなたのdessing力が生 MyClassのために管理していると仮定すると
class MyClass { 
private: 
    std::vector<unsigned char> m_Buffer; 
    // No size member is needed, it is stored in m_Buffer 
public: 
    // No size parameter is needed, it is stored in Array 
    void SetBuffer(const std::vector<unsigned char> &Array); 
}; 

void MyClass::SetBuffer(const std::vector<unsigned char> &Array) { 
    std::copy(Array.begin(), Array.end(), m_Buffer.begin()); 
} 

MyClass::MyClass(const MyClass &Class) { 
    m_BufferSize = Class.m_BufferSize; 
    m_Buffer = new new unsigned char[m_BufferSize]; 
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
} 

MyClass::operator =(const MyClass &Class) { 
    if (m_Buffer) delete [] m_Buffer; 
    m_BufferSize = Class.m_BufferSize; 
    m_Buffer = new new unsigned char[m_BufferSize]; 
    memcpy(m_Buffer, Class.m_Buffer, m_BufferSize); 
} 

あなたドン場合コピーコンストラクタでMyClass管理ポインタを処理し、operator =の場合、同じメモリを管理するMyClassの2つのインスタンスが終了します。

+1

質問は明示的に、現在のポインタをarray + sizeに 'vector'で置き換えることです。 –

+0

はい、投稿後に気付きました。しかし最終的には、アドバイスは同じです。私は、生ポインタの代わりに 'std :: vector'を使う方が良いと思います。 –