【问题标题】:How to copy span of chars from char array to vector?如何将字符范围从字符数组复制到向量?
【发布时间】:2012-12-05 14:06:52
【问题描述】:

如何将字符范围从字符数组复制到向量?起始索引始终为 0,并转到某个传递的值 x。我在堆上有 char* 缓冲区(大小为 32*1024),我正在使用该缓冲区接收消息并在变量 x 中设置接收到的消息大小。如何从第 0 个字符复制到第 x 个字符到 vector<char> mainBuffer ? (我可以简单地进行迭代,但如果消息很长,它看起来效率低下。另一种方法如下所示,但我总是在每次传递中创建新向量)

char* buffer = new char[32*1024];
int x;
std::vector<std::vector<char> > mainBuffer;
//:loop
// here is some code where I recive message in buffer and set x
mainBuffer.push_back(std::vector<char>(buffer,buffer+x));
//:end loop

有谁知道更高效、更优雅的方法吗?

【问题讨论】:

  • 在 C++11 中,vector 会被移动,所以它不是低效的。
  • 你的问题让我很困惑。 mainBuffervector&lt;char&gt; 还是 vector&lt;vector&lt;char&gt;&gt;

标签: c++ stl


【解决方案1】:
mainBuffer.push_back(std::vector<char>(buffer,buffer+x));

有没有人知道更有效和优雅的方式来做到这一点?

使用 C++11,执行以下操作:

mainBuffer.emplace_back( buffer,buffer+x );

这会转发参数并直接在 mainBuffer 中构造对象。

编辑:使用 C++(旧),使用 std::swap:

mainBuffer.push_back( std::vector<char>() );
mainBuffer.back().swap( std::vector<char>(buffer, buffer+x) );

编辑 2:如果可以,请在 mainBuffer 上调用 reserve,然后再对其使用 push_back。

【讨论】:

    【解决方案2】:

    如果您真的在寻找效率,那么在协议中执行此操作的典型方法是:

    char* mainBuffer = new char[veryLargeNumber]
    char* mainBufferPos = mainBuffer;
    char* buffer = new char[normallyASmallNumber] 
    while(...) {
        ...receive n bytes in buffer....
        memcopy(mainBufferPos, buffer, n);
        mainBufferPos += n;
        if (mainBufferPos > mainBuffer+veryLargeNumber) 
            break;    // buffer full, needs probably more handling...
    }
    

    通常情况下,我希望 32*1024 比您的大缓冲区的大小更大,并且您收到的消息的长度更多地低于 1024。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 2015-03-28
      • 2022-01-05
      • 1970-01-01
      • 2022-11-30
      • 2015-09-03
      • 2019-08-13
      • 2016-05-03
      相关资源
      最近更新 更多