c ++ массив для векторного выпуска - PullRequest
2 голосов
/ 13 октября 2010

Я пытаюсь скопировать массив в вектор, однако, когда данные копируются в вектор, он отличается от исходного массива.

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 ]

9 голосов
/ 13 октября 2010

The

int arraySize = 640000;

должно быть const в стандартном C ++. g ++ допускает использование массивов переменной длины в качестве расширения языка C99. Лучше отключить это расширение. : -)

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

ОК, если arraySize равно const, но не будет компилироваться, например, 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)); 

Лучше просто использовать assign метод std:.vector, например vector_buffer.assign( buffer, buffer + arraySize ).

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

Опять же, здесь отображаются элементы без промежутков между ними.

Очевидная проблема все еще существует, когда вы исправили эти вещи?

Если это так, то, пожалуйста, опубликуйте также вашу populateArray функцию.

3 голосов
/ 13 октября 2010

Я не вижу ничего плохого в вашем коде. Следующий код

#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 голос
/ 13 октября 2010

Я написал полную скомпилированную программу для вас.Код выглядит нормально.Я запускаю его и получаю ожидаемый результат.Возможно, вам необходимо перепроверить код, который вы разместили, с реальным кодом.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...