2010-10-13 56 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; 
}