[英]How to append multiple elements to a repeatedField in Protocol buffers?
給定消息
message My_msg{
repeated double my_arr = 1;
}
如何才能將一個 append 元素放入現場?
通過覆蓋當前內容復制/移動已分配的完整 arrays 有一個答案,但是如果該字段中已經有一些數據需要保持原樣怎么辦?
使用以下代碼是否安全?
void set_data(std::vector<double> table, My_msg* message){ /* suppose message is valid */
message->mutable_my_arr()->Resize(message->my_arr_size() + table.size(),0);
message->mutable_my_arr()[message->my_arr_size() - table.size()] = {table.begin(),table.end()};
}
我認為您的示例代碼不會構建。 My_msg::mutable_my_arr()
返回一個指向RepeatedField
的指針(不是數組的第一個元素)。 嘗試對其進行索引充其量會出現段錯誤。
就性能而言,如果您將數據保存在std::vector
中,您將始終需要復制 - 因此您可以嘗試加快速度。
您可以在之前調用RepeatedField::Reserve
。 然后你可以寫一個循環,或者使用RepeatedFieldBackInserter
:
void set_data(const std::vector<double>& table, My_msg* message){
message->mutable_my_arr()->Reserve(message->my_arr_size() + table.size());
std::copy(
table.begin(),
table.end(),
RepeatedFieldBackInserter(message->mutable_my_arr()));
}
只需調用My_msg::add_my_arr
:
void set_data(std::vector<double> table, My_msg* message) {
for (auto ele : table) {
message->add_my_arr(ele);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.