使用std :: copy复制到std :: deque

时间:2014-11-08 16:15:41

标签: c++

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

4 个答案:

答案 0 :(得分: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);

答案 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 ++中是不好的做法。