如何将多个元素附加到协议缓冲区中的重复字段?
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()));
}
收到消息
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()));
}