使用 std::copy 复制到 std::d eque
Using std::copy to copy into an std::deque
我有一个 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":在以下情况下必须是类或命名空间 后跟 '::' C:\Program Files (x86(\Microsoft Visual Studio 12.0\vc\include\x实用程序 371 1 a 错误 5 错误 C2039:"iterator_category":不是"全局"的成员 命名空间'' C:\Program Files (x86(\Microsoft Visual Studio 12.0\vc\include\x实用程序 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\include\xutility 372 1 A
错误告诉你你做错了什么。 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);
你不需要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;
}
我认为在堆中分配缓冲区没有任何意义。尽管如此,有效的代码将看起来像
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
这是我的做法
#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;
}
我用一个范围构造它,好东西,它实际上在甲板上放置了值。如果你有大的 ojects 而不是字符,它会比你的方法更快。专业提示:不要在不需要的地方使用原始指针。这在C++是不好的做法。
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 为什么 std::d eque 不允许指定存储桶大小?
- 为什么 std::queue 没有实现 insert() 而 std::d eque 实现了?
- 我可以在 c++11 中的 std::d eque 上使用 std::max_element() 吗?
- 是否可以将 std::d eque 的成员函数作为参数传递?
- 从 std::d eque 线程对 emplace_back() 和运算符 []() 的并发调用是否安全?
- std::d eque : "insertion and deletion of elements may invalidate iterators"是什么意思?
- std::d eque 和多线程访问
- 填充 std::d eque<std::vector<std::string>> with boost::assign::list_of
- std::d eque - 下标超出范围
- 使用 std::d eque<std::string> 时出错
- C++中的字符串生产者/消费者:std::d eque<char> 还是 std::stringstream?
- 在 std::vector::erase() 和 std::d eque::erase() 中复制/移动赋值
- 是否可以同时从 std::vector 或 std::d eque 中删除和获取对象的副本C++
- 在 C++11 中将 std::vector 移动到 std::d eque
- 如何有效地将一系列项目插入中间的 std::d eque 中,带有 C++03
- 与 std::d eque 一起使用时,不能将 Boost::mutex 作为私有类成员吗?
- std::d eque 什么时候需要重新分配
- 为什么更喜欢std::vector而不是std::d eque