连接多个缓冲区的有效方法

时间:2015-12-29 15:30:22

标签: c++

我需要设计一个包含2个主要功能的高效可读类:

  • add_buffer(char* buffer) - 添加缓冲区。
  • char* read_all() - 获取一个大缓冲区,其中包含用户到目前为止添加的所有缓冲区(按顺序)。

例如:

char first_buffer[] = {1,2,3};
char second_buffer[] = {4,5,6};

MyClass instance;
instance.add_buffer(first_buffer);
instance.add_buffer(second_buffer);
char* big_buffer = instance.read_all(); // big_buffer = [1,2,3,4,5,6]

注意:这个问题有很多解决方案,但我正在寻找一个有效的解决方案,因为在现实生活中缓冲区会很多很多,我想保存一个很多复制和reallocs(就像std :: vector一样)。我还想要一个可读的c ++代码。

注意:现实生活中的问题是:我正在从分离的块中找到的HTTP请求中读取数据。在所有块到达后,我想将整个数据返回给用户。

3 个答案:

答案 0 :(得分:8)

使用内存足够reservedstd::vector<char>。从C ++ 11开始,您可以使用std::vector::data()访问内部缓冲区(直到C ++ 11,您必须使用&*std::vector::begin())。

答案 1 :(得分:2)

如果您可以使用Boost,boost::algorithm::join将执行:

#include <boost/algorithm/string/join.hpp>
#include <vector>
#include <iostream>

int main(int, char **)
{
    std::vector<std::string> list;
    list.push_back("Hello");
    list.push_back("World!");

    std::string joined = boost::algorithm::join(list, ", ");
    std::cout << joined << std::endl;
}
     

输出:

Hello, World!
TristramGräbener的

Original answer

答案 2 :(得分:-1)

使用一些标准方法,例如

  • 从一些初始内存开始,比如256
  • 每当完全使用时,重新分配并加倍大小。

如果您不想自己动手,请使用

等STL容器
std::vector<char>

当缓冲区已满时,它会自动为您重新分配内存。