有没有更简洁的方法将std :: string组合成std :: vector <char>?

时间:2016-11-23 10:52:33

标签: c++ string insert std stdvector

我有一些代码将各种元素组合到一个缓冲区中。我的代码看起来像这样:

static void CreatePacket(const std::string& source, const std::string id, const std::string payload, std::vector<char>& buffer)
{
    buffer.resize(source.size() + id.size() + payload.size());
    std::vector<char>::iterator bufferDest = buffer.begin();

    // Start the message
    char MessageStart = '$';
    *bufferDest = MessageStart;
    ++bufferDest;

    // Copy the message source
    std::copy(source.begin(), source.end(), bufferDest);
    bufferDest += source.size();

    // Copy the message id
    std::copy(id.begin(), id.end(), bufferDest);
    bufferDest += id.size();
}

该方法的调用如下:

std::vector<char> buffer;

std::string source = "AB";
std::string id = "CDE";
std::string payload = "payload";

CreatePacket(source, id, payload, buffer);

我在std做事的方式上仍然有点绿,但我的实现感觉有点笨拙(具体来说,必须在每次复制后明确增加bufferDest)。有更清洁的方法吗?

如果有所不同,我的编译器不支持C ++ 11。

3 个答案:

答案 0 :(得分:8)

我认为这更清楚。

void CreatePacket(const std::string& source, const std::string& id, const std::string& payload, std::vector<char>& buffer)
{
    buffer.clear();
    buffer.reserve(source.size() + id.size() + payload.size() + 1);

    buffer.push_back('$');

    std::copy(source.begin(), source.end(), std::back_inserter(buffer));
    std::copy(id.begin(), id.end(), std::back_inserter(buffer));
    std::copy(payload.begin(), payload.end(), std::back_inserter(buffer));
}

答案 1 :(得分:3)

您可以使用正确的vector::insert() overloadstring的末尾附加vector的内容(无需使用std::copy或{使代码复杂化{1}}如其他答案所示),例如:

std::back_inserter

所以你的功能看起来像这样:

buffer.insert(buffer.end(), source.begin(), source.end());

答案 2 :(得分:2)

它几乎是干净的,除了你可以使用std::copy的返回值,从而摆脱bufferDest的显式增量:

static void CreatePacket(const std::string& source, const std::string id, const std::string payload, std::vector<char>& buffer)
{
    buffer.resize(source.size() + id.size() + payload.size());
    std::vector<char>::iterator bufferDest = buffer.begin();

    // Start the message
    char MessageStart = '$';
    *bufferDest = MessageStart;
    ++bufferDest;

    // Copy the message source
    bufferDest = std::copy(source.begin(), source.end(), bufferDest);

    // Copy the message id
    bufferDest= std::copy(id.begin(), id.end(), bufferDest);
}