c ++数组到向量问题

时间:2010-10-13 17:29:48

标签: c++ arrays vector copy

我试图将数组复制到矢量,但是,当数据被复制到矢量时,它与原始数组的数据不同。

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   

数据似乎以某种方式被压缩。将数组复制到向量的任何方法都可以做同样的事情。

我用它来创建图像视频。如果我使用数组数据一切都很好,但如果我使用矢量数据它不起作用。

任何帮助都将受到高度赞赏。

干杯

3 个答案:

答案 0 :(得分:9)

int arraySize = 640000;

在标准C ++中需要const。 g ++允许可变长度数组作为C99启发的语言扩展。最好关闭该扩展程序。 : - )

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

arraySizeconst时确定,但不会使用例如populateArray(&buffer); 进行编译使用原始代码的Visual C ++。

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

以上打印数据,元素之间没有间距。更好地添加一些间距。或换行。

assign

最好只使用std:.vector的{​​{1}}方法,例如vector_buffer.assign( buffer, buffer + arraySize )

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

同样,这会显示没有间距的元素。

当你修复这些东西时,问题仍存在吗?

如果是,请同时发布您的populateArray功能。

答案 1 :(得分: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.。 (即使我使用不太理想的方式复制到矢量中。)

由于您显示的代码无法编译,我得出的结论是您没有显示真实的代码。请这样做。在你的真实代码和我的代码之间的差异必定是问题。

答案 2 :(得分: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;
}