2014-11-08 2 views
1

У меня есть массив unsigned char Temp[SERVER_BUFFER_SIZE] C-стиль, и я хочу, чтобы скопировать его в std::deque в конце (больше как добавить его)Использования зОго :: копии для копирования в станд :: DEQUE

std::deque<unsigned char>* buffer = new std::deque<unsigned char>(); 
std::copy(Temp[0], Temp[SERVER_BUFFER_SIZE], buffer->cend()); 

И Я получаю много ошибок, подобные этим:

ошибка 4 ошибка C2825: «_Iter»: должен быть класс или пространство имен, когда следует «::» C: \ файлы программы (x86) \ Microsoft визуальная студия 12.0 \ vc \ include \ xutility 371 1 a Ошибка 5 ошибка C2039: 'iterator_category': не является членом ' `global namespace '' c: \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 371 1 a Ошибка 9 ошибка C2825: '_Iter': должен быть класс или пространство имен, за которым следует ':: 'c: \ программные файлы (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 372 1 a Ошибка 12 ошибка C2602:' std :: iterator_traits < _InIt> :: value_type 'не член базы класс 'STD :: iterator_traits < _init>' C: \ Program файлы (x86) \ Microsoft Visual Studio 12.0 \ VC \ включить \ xutility 372 1

+1

Почему вы используете 'new' для создания очереди? –

+0

Чтобы я мог передать его в другое место вне области этой функции –

+1

Чтобы добиться этого, лучше использовать 'std :: unique_ptr >'. –

ответ

2

Я не вижу никакого смысла выделять буфер куча. Тем не менее, правильный код будет выглядеть

std::deque<unsigned char>* buffer = new std::deque<unsigned char>(); 
std::copy(Temp, Temp + SERVER_BUFFER_SIZE, std::back_inserter(*buffer)); 

Вот демонстративной программа

#include <iostream> 
#include <deque> 
#include <iterator> 

int main() 
{ 
    const size_t SERVER_BUFFER_SIZE = 6; 
    unsigned char Temp[SERVER_BUFFER_SIZE] = "Hello"; 

    std::deque<unsigned char> *buffer = new std::deque<unsigned char>(); 

    std::copy(Temp, Temp + SERVER_BUFFER_SIZE, std::back_inserter(*buffer)); 

    for (unsigned char c : *buffer) std::cout << c; 
    std::cout << std::endl; 

    delete buffer; 

    return 0; 
} 

Выход

Hello 
+0

Лучше научить человека также использовать соответствующий конструктор и избежать ненужного усложнения, многословия и неэффективности 'copy' +' back_inserter'. Интересно, когда так часто самый простой способ является наиболее эффективным и т. Д., Почему они придумывают все эти схемы Рубе Голдберга. Argh. –

+0

@ Cheers и hth. - Alf Мы не знаем, в какой задаче эти конструкции используются. Может быть, deque уже был создан и добавлен в другое место. –

+0

Я имел в виду «тоже». А также функция 'insert'. В зависимости от контекста конструктором или 'insert' будет рациональный выбор. –

4

Ошибка говорит вам, что вы делаете неправильно. std::copy принимает итераторы, и вы даете ему символы. Temp[0] и Temp[SERVER_BUFFER_SIZE] всего лишь unsigned char.

Но вам не нужно std::copy, сама deque занимает два-итератора конструктор:

std::deque<unsigned char>* buffer = new std::deque<unsigned char>(Temp, 
               Temp + SERVER_BUFFER_SIZE); 

или просто:

std::deque<unsigned char> buffer(Temp, Temp + SERVER_BUFFER_SIZE); 
2

Вам не нужно std::copy сделать это с std::deque. std::deque имеет функцию-член std::deque::insert, и вы могли бы добавить диапазон к нему следующим образом:

#include <iostream> 
#include <deque> 
#include <memory> 

int main() { 
    std::deque<unsigned char> dq; 
    unsigned char buf[] = { 1, 2, 3, 4 }; 

    dq.insert(dq.end(), buf, buf + 4); 

    for (auto i : dq) std::cout << i << " "; 
    std::cout << std::endl; 

    return 0; 
} 

Лучше всего, если C++ 11 является вариант, не используйте сырые указатели и вместо того, чтобы использовать смарт-указатель, как std::unique_ptr :

#include <iostream> 
#include <deque> 
#include <memory> 

int main() { 
    std::unique_ptr<std::deque<unsigned char>> dq(new std::deque<unsigned char>); 
    unsigned char buf[] = {1, 2, 3, 4}; 

    dq->insert(dq->end(), buf, buf + 4); 

    for(auto i : *dq) std::cout << i << " "; 
    std::cout << std::endl; 

    return 0; 
} 
1

Вот как я бы сделал это

#include <iostream> 
#include <deque> 
#include <iterator> 

int main() 
{ 
    const size_t SERVER_BUFFER_SIZE = 6; 
    unsigned char Temp[SERVER_BUFFER_SIZE] = "Hello"; 

    std::deque<unsigned char> buffer(Temp, Temp+SERVER_BUFFER_SIZE); 

    for (auto c : buffer) 
    std::cout << c; 
} 

Я построить его с диапазоном, хорошая вещь, это на самом деле устанавливать значения в й e колода. Если бы у вас были большие варианты вместо символов, это было бы быстрее, чем ваш подход. protip: Не используйте необработанные указатели там, где они не нужны. Это плохая практика на C++.

+0

Почему вы используете уродливое нарушение глаз в верхнем регистре. рассмотрите соглашение об именах для макросов и для чего оно предназначено. что это было снова? –

+0

Согласованность с соглашением об именах OP. –

Смежные вопросы