2010-10-13 60 views
2

我試圖將數組複製到一個向量,但是,當數據被複制到與原始數組不同的向量時。C++數組向量問題

int arraySize = 640000; 

std::vector<unsigned char> vector_buffer; 
unsigned char buffer[arraySize]; 

populateArray(&buffer); 

for(int i = 0; i < arraySize; i++) 
    cout << buffer[i]; // this prints out data 


std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 


for(int i = 0; i < arraySize; i++) 
    cout << vector_buffer[i]; // this prints out different data 

數據似乎被壓縮了。將數組複製到矢量的任何方法都是一樣的。

我使用它從圖像創建視頻。如果我使用數組數據一切都很好,但如果我使用矢量數據,它不起作用。

任何幫助將不勝感激。

乾杯

+0

這是最麻煩的。這是一個輸出錯誤,還是比較緩衝區和向量字節到字節的識別差異?如果是這樣,他們是什麼?他們是否遵循任何模式,例如正常的偏移或只有一些值受到影響? – 2010-10-13 17:33:47

+0

所提供的代碼應該可以工作。這是真正的代碼失敗嗎?數組和矢量的類型是否相同? - 注意你可以使用''vector_buffer.insert(buffer,buffer + arraySize)'(可能更有效)',但這與手頭的問題無關。 – 2010-10-13 17:35:32

+0

你可以嘗試array_size爲10或20並向我們展示putput?另外我不確定unsigned char buffer [arraySize]可以在所有編譯器上編譯。 – 2010-10-13 17:37:33

回答

9

int arraySize = 640000; 

需要是在標準C++ const。 g ++允許將可變長度數組作爲C99啓發式語言擴展。最好關閉延長線。 :-)

std::vector<unsigned char> vector_buffer; 
unsigned char buffer[arraySize]; 

OK時arraySizeconst,但不會如編譯Visual C++與您的原始代碼。

populateArray(&buffer); 

這應該最有可能是populateArray(buffer),除非你有populateArray一個非常奇怪的聲明。

for(int i = 0; i < arraySize; i++) 
    cout << buffer[i]; // this prints out data 

以上打印數據時元素間沒有間距。最好添加一些間距。或換行符。

std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 
更好

只是使用的std:.vectorassign方法,像vector_buffer.assign(buffer, buffer + arraySize)

for(int i = 0; i < arraySize; i++) 
    cout << vector_buffer[i]; // this prints out different data 

再次,這顯示的元素之間沒有間距。

當你修復這些東西時,仍然存在明顯的問題嗎?

如果是這樣,那麼請張貼您的populateArray函數。

+1

+1使用'assign()'。我懷疑,在OP的代碼中,'vector_buffer'在聲明和對'std :: copy()'的調用之間有所不同。如果可能的話,甚至更好的辦法是延遲'vector_buffer'構造,直到'buffer'準備好,然後執行'vector_buffer(buffer,buffer + arraySize)',就像在@sbi的代碼中一樣。 – Arun 2010-10-13 17:57:29

3

我什麼也看不到你的代碼錯誤。以下代碼

#include <iostream> 
#include <vector> 

int main() 
{ 
    const std::size_t arraySize = 640000; 

    unsigned char buffer[arraySize]; 

    for(std::size_t idx = 0; idx < arraySize; ++idx) 
     buffer[idx] = idx; 

    std::vector<unsigned char> vector_buffer(buffer, buffer + arraySize); 
    //std::vector<unsigned char> vector_buffer; 
    //std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 

    for(std::size_t idx = 0; idx < arraySize; ++idx) 
     if(buffer[idx] != vector_buffer[idx]) 
     { 
      std::cout << "error @" << idx << '\n'; 
      return 1; 
     } 
    std::cout << "Ok.\n"; 

    return 0; 
} 

打印Ok.對我來說。 (即使我使用複製到矢量中的不太理想的方式)

從您顯示的代碼不能編譯的事實中得出結論,您並未顯示真實的代碼。請這樣做。真正的代碼和我的代碼之間的差異肯定是問題所在。

1

我已經爲您編寫了一個完整的可編譯程序。代碼顯示正常。我運行它並獲得預期的輸出。也許你需要重新檢查你發佈的代碼與真實的代碼。

#include <cstdlib> 
#include <vector> 
#include <iostream> 
#include <iterator> 
using namespace std; 

void populateArray(unsigned char* buf, size_t buf_size) 
{ 
    unsigned char* buf_end = &buf[buf_size]; 
    for(unsigned char c = 'A'; buf != buf_end; c = (c=='Z'?'A':c+1), ++buf) 
     *buf = c; 
} 

int main() 
{ 

    static const int arraySize = 64; 

    std::vector<unsigned char> vector_buffer; 
    unsigned char buffer[arraySize]; 

    populateArray(buffer, sizeof(buffer)); 

    for(int i = 0; i < arraySize; i++) 
      cout << buffer[i]; // this prints out data 

    cout << endl; 


    std::copy (buffer, buffer + arraySize, std::back_inserter(vector_buffer)); 


    for(int i = 0; i < arraySize; i++) 
      cout << vector_buffer[i]; // this prints out different data 

    return 0; 
}