簡體   English   中英

如何 append 多個元素到協議緩沖區中的重復字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM