我有一些代码将各种元素组合到一个缓冲区中。我的代码看起来像这样:
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。
答案 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()
overload在string
的末尾附加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);
}