在這個問題中,回答了如何通過使用將向量復制到重復欄位中fMessage.mutable_samples() = {fData.begin(), fData.end()};(另一個方向也可以)。
但是部分副本呢?下面的作業嗎?
std::copy(
fData.begin() 3, fData.end() - 2,
fMessage.mutable_samples()->begin() 3
);
在這種情況下fMessage,已經在samples欄位中分配了元素,std::copy并將覆寫fMessage.
uj5u.com熱心網友回復:
檢查 RepeatedField 的API。
IMO你應該使用這個:
fMessage.mutable_samples()->Add(fData.begin() 3, fData.end() - 2);
// or
fMessage.mutable_samples()->Assign(fData.begin() 3, fData.end() - 2);
uj5u.com熱心網友回復:
如果samples是原始型別,例如 int32、double,您可以使用該Add方法在 末尾附加一系列專案samples:
fMessage.mutable_samples()->Add(fData.begin() 3, fData.end() - 2);
如果samples是字串或訊息型別,并且您使用的是 protobuf 3.16 或更高版本,那么您很幸運,您可以使用上述解決方案。
但是,如果您的 protobuf 早于 3.16,則必須在回圈中添加一系列字串或訊息型別的專案:
for (auto iter = fData.begin() 3; iter != fData.end() - 2; iter)
*(fMessage.add_samples()) = *iter;
uj5u.com熱心網友回復:
我創建了一個程式來測驗這個,似乎 usingstd::copy有效!
syntax = "proto3";
message messagetest{
repeated float samples = 6;
}
#include <iostream>
#include <vector>
#include "message.pb.h"
int main(){
std::vector<float> fData(10);
messagetest fMessage;
std::generate(fData.begin(),fData.end(),[&fMessage](){
static float num = 0.0;
num = 1.0;
fMessage.add_samples(0.0);
return num;
});
for(const float& f : fData)
std::cout << "[" << f << "]";
std::cout << std::endl;
std::copy(
fData.begin() 3, fData.end() - 2,
fMessage.mutable_samples()->begin() 3
);
for(const float& f : fMessage.samples())
std::cout << "[" << f << "]";
std::cout << std::endl;
return 0;
}
輸出:
[1][2][3][4][5][6][7][8][9][10]
[0][0][0][4][5][6][7][8][0][0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444263.html
下一篇:相同的數學和數字不同的答案?
