2012-08-20 28 views
6

Tôi có một lớp có (trong số rất nhiều thứ khác) một con trỏ tới unsigned char bị xóa và được phân bổ lại để lưu trữ một số dữ liệu từ một mảng khác. Việc này được thực hiện với chức năngLàm thế nào tôi có thể làm tương đương với memcpy từ một mảng thô đến một std :: vector?

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; 
    } 

Tôi không thích mã này, và tôi thực sự muốn thay thế con trỏ bằng std::vector<unsigned char>. Câu hỏi của tôi là, tôi sẽ thực hiện khía cạnh memcpy như thế nào? Nếu tôi đã đi qua một vector như là đối số cho chức năng của tôi, tôi có thể sao chép nó bằng cách sử dụng vòng lặp, nhưng tôi không có quyền kiểm soát đối số tham số loại vì vậy tôi bị mắc kẹt với unsigned char*. Có cách nào để sử dụng trình vòng lặp hay định cỡ vectơ đúng kích cỡ và sau đó truy cập mảng nội bộ của nó sao cho tôi vẫn có thể sao chép dữ liệu với memcpy? Hoặc thậm chí tốt hơn một cái gì đó bằng cách sử dụng iterators ?? Tôi biết tôi có thể sử dụng một vòng lặp và push_back nhưng điều đó dường như không hiệu quả với tôi. Bất kỳ lời đề nghị sẽ được biết ơn.

Trả lời

19

Thực ra, các trình vòng lặp được mô hình hoá từ các con trỏ và do đó các con trỏ trong một mảng được xem là triển khai khái niệm RandomAccessIterator.

Do đó:

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

+1 Giải pháp tốt nhất –

+0

Điều này sẽ tự động thay đổi kích thước véc tơ hoặc tôi có phải gọi rõ ràng và đặt kích thước của nó thành kích thước của mảng không? – mathematician1975

+0

@ mathematician1975 xem [tại đây] (http://en.cppreference.com/w/cpp/container/vector/assign). Bạn không cần phải gọi rõ ràng, thay đổi kích thước hoặc bất cứ điều gì. – juanchopanza

0

tôi thực sự khuyên bạn nên tránh con trỏ nguyên theo cách này. Tôi nghĩ rằng đó là một ý tưởng tốt hơn để quản lý std :: vectơ thay vì các con trỏ thô.

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()); 
} 

Giả sử rằng các lực lượng dessing của bạn để có một liệu quản lý cho MyClass bạn sẽ chăm sóc của con trỏ này vào constructor sao chép và operator = (hoặc thoát khỏi nó thay vì):

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); 
} 

Nếu bạn don 't chăm sóc của MyClass con trỏ được quản lý trong constructor sao chép và operator = bạn sẽ kết thúc với hai trường hợp MyClass quản lý cùng một bộ nhớ.

+1

Câu hỏi là rõ ràng về việc thay thế con trỏ hiện tại thành mảng + kích thước bằng một 'vectơ'. –

+0

Có, tôi đã nhận ra sau khi đăng. Nhưng cuối cùng, lời khuyên là như nhau, tôi nghĩ rằng tốt hơn nên sử dụng 'std :: vector' thay vì con trỏ thô. –

Các vấn đề liên quan