如何将多个元素附加到协议缓冲区中的重复字段?

How to append multiple elements to a repeatedField in Protocol buffers?

收到消息

message My_msg{
  repeated double my_arr = 1;
}

如何将元素追加到字段中?

There is an answer for copying/moving already allocated full arrays by overwriting the current contents,但是如果归档中已经有一些数据需要保持原样怎么办?

使用下面的代码安全吗?

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::add_my_arr:

void set_data(std::vector<double> table, My_msg* message) {
    for (auto ele : table) {
        message->add_my_arr(ele);
    }
}

我认为您的示例代码无法构建。 My_msg::mutable_my_arr() returns 指向 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()));
}