2014-11-08 67 views
1

我有一個C數組unsigned char Temp[SERVER_BUFFER_SIZE],我想將它複製到一個std::deque末(更喜歡將其追加)使用std ::副本複製到一個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':必須是一個類或命名空間時,隨後 通過 '::' C:\ Program Files文件(x86)的\微軟visual studio 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:\ program files (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:\程序 文件(86)\微軟的Visual Studio 12.0 \ VC \包括\ xutility 372 1

+1

爲什麼你使用'new'來實例化你的隊列? – 2014-11-08 16:18:01

+0

以便我可以將它傳遞到該函數範圍之外的其他地方 – 2014-11-08 16:19:54

+1

更好地使用std :: unique_ptr >來實現此目的。 – 2014-11-08 16:21:14

回答

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計劃。哎呀。 – 2014-11-08 17:52:08

+0

@乾杯和hth。 - Alf我們不知道這些結構在哪個任務中被使用。可能是deque已經創建並且被附加到其他地方。 – 2014-11-08 17:54:43

+0

我的意思是「也」。還有'insert'成員函數。根據上下文,構造函數或「插入」將是理性的選擇。 – 2014-11-08 17:59:50

4

錯誤告訴你,你做錯了什麼。 std::copy需要迭代器,你給它的字符。 Temp[0]Temp[SERVER_BUFFER_SIZE]只是unsigned char

但你並不需要std::copydeque本身需要兩個迭代器的構造函數:

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::copystd::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

爲什麼你使用難看的眼睛大寫的大寫字母。考慮宏的命名約定和它的用途。你剛說什麼? – 2014-11-08 17:49:24

+0

與OP的命名約定一致。 – 2014-11-09 17:47:33

相關問題