使用 std::copy 复制到 std::d eque

Using std::copy to copy into an std::deque

本文关键字:std eque copy 使用 复制      更新时间:2023-10-16

我有一个 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::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);

你不需要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++是不好的做法。