我有一个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:&#39; _Iter&#39;:必须是类或命名空间 其次是&#39; ::&#39; c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 371 1 a错误5错误C2039:&#39; iterator_category&#39; :不是全球的成员 命名空间&#39;&#39; c:\ program files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 371 1 a错误9错误C2825:&#39; _Iter&#39;:当后面跟着&#39; ::&#39;时必须是类或命名空间c:\ program files (x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 372 1 a 错误12错误C2602:&#39; std :: iterator_traits&lt; _InIt&gt; :: value_type&#39;不是 &#39; std :: iterator_traits&lt; _InIt&gt;&#39;基类的成员C:\程序 files(x86)\ microsoft visual studio 12.0 \ vc \ include \ xutility 372 1 a
答案 0 :(得分: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);
答案 1 :(得分: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
答案 2 :(得分: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;
}
答案 3 :(得分: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;
}
我用范围构建它,好东西,它实际上在牌组中赋予了价值。如果你有大的项目而不是字符,它会比你的方法更快。 专家提示: 不要在他们不需要的地方使用原始指针。这在C ++中是不好的做法。