2014-11-08 1 views
1

나는 C 스타일 배열 unsigned char Temp[SERVER_BUFFER_SIZE]을 가지고 있고 나는 끝에 std::deque에 복사 할

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

그리고

는 오류 4 오류 C2825 : '_Iter이': \ 프로그램 파일 (86) \ 마이크로 소프트 : 이 '::'에 의해 C를 따라 클래스 또는 네임 스페이스해야합니다 나는이 같은 오류를 많이 받고 있어요 비주얼 스튜디오 12.0 \ vc \ include \ xutility 371 1 오류 5 오류 C2039 : 'iterator_category': ' 'global 네임 스페이스' 'c : \ program files (x86) \ microsoft visual studio 12.0 \ vc \ include \ xutility 371 1 오류 9 오류 C2825 :'_Iter ':':: Iter ' 'c : \ program files (x86) \ Microsoft Visual Studio 12.0 \ vc \ include \ xutility 372 1 오류 12 오류 C2602 :'std :: iterator_traits < _InIt :: :: value_type '이 (가) 베이스 멤버가 아닙니다. 클래스 '표준 : : iterator_traits <은 _INIT>'C를 : \ 프로그램 파일 (86) \ 마이크로 소프트 비주얼 스튜디오 12.0 \ VC의 \ 포함 \ xutility 372 일 나는에서 버퍼를 할당 할 수있는 감각을 볼 수 없습니다

+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'의 불필요한 복잡성, 자세한 정보 및 비효율을 피하도록 사용자에게도 더 잘 가르쳐주십시오. 가장 자주 사용되는 가장 간단한 방법이 가장 효율적 일 때, 왜 Rube Goldberg의 모든 계획을 생각해 내는지 궁금합니다. 아하. –

+0

@ 건배와 hth. - Alf 우리는 이러한 구성이 사용 된 작업을 알지 못합니다. deque가 이미 생성되어 다른 곳에 추가 될 수 있습니다. –

+0

나는 "역시"를 의미했습니다. 또한'insert' 멤버 함수도 있습니다. 컨텍스트에 따라 생성자 또는'insert'가 합리적인 선택이 될 것입니다. –

4

오류 당신이 잘못하고있는 일을 설명합니다. std::copy은 반복자를 사용하며 문자를주고있다. Temp[0]Temp[SERVER_BUFFER_SIZE]은 단지 unsigned char입니다.

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::deque이 작업을 수행 할 std::copy 필요하지 않습니다

하지만 std::copy 필요가 없습니다, 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; 
} 

++ (11)이 옵션을는 C, 원시 포인터를 사용하는 대신 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; 
} 

을 할 거라고 방법, 좋은 점은, 실제로 일의 값을 갖다 두도록 전자 갑판. 만약 당신이 chars 대신 큰 ojects했다면, 그것은 당신의 접근보다 빠를 것이다. protip : 원시 포인터는 필요하지 않은 곳에 사용하지 마십시오. C++에서는 나쁜 습관입니다.

+0

왜 대문자를 사용하고 있습니까? 매크로의 명명 규칙과 그 용도를 고려하십시오. 그거 뭐야? –

+0

OP의 명명 규칙과 일관성. –