菜鸟笔记
提升您的技术认知

protobuf中repeated类型变量赋值方法

1.给repeated类型的变量赋值

1.1 逐一赋值

定义protobuf结构如下:

message Person {
  
  required int32 age = 1;
  required string name = 2;
}

message Family {
  
  repeated Person person = 1;
}

对person进行赋值的方法如下:

int main(int argc, char* argv[])
{
  
 
	GOOGLE_PROTOBUF_VERIFY_VERSION;
 
	Family family;
	Person* person;
 
	// 添加一个家庭成员,John
	person = family.add_person();
	person->set_age(25);
	person->set_name("John");
 
	// 添加一个家庭成员,Lucy
	person = family.add_person();
	person->set_age(23);
	person->set_name("Lucy");
 
	// 添加一个家庭成员,Tony
	person = family.add_person();
	person->set_age(2);
	person->set_name("Tony");
 
	// 显示所有家庭成员
	int size = family.person_size();
 
	cout << "这个家庭有 " << size << " 个成员,如下:" << endl;
 
	for(int i=0; i<size; i++)
	{
  
		Person psn = family.person(i);
		cout << i+1 << ". " << psn.name() << ", 年龄 " << psn.age() << endl;
	}
 
	getchar();
	return 0;
}

还可以用类似与vector中的pushback方法逐一添加person。

1.2 整体赋值

将整个vector类型的变量整体赋值给repeated类型的变量。

定义protobuf结构如下:

message VehicleNavigationStage {
  
  enum NavigationMode{
  
    STATIC_DESTINATION = 0;
    DYNAMIC_DESTINATION = 1;
    PATH_PATROLLING = 2;
  }
  optional NavigationMode navigation_mode = 1;// 导航的模式
  optional PointLLHA destination_point = 2;// 目标点
  repeated VehicleMissionPoint mission_points = 3;// 途经点
  optional double lateral_offset = 4;// 相对于目标的横向偏差
  optional double longitudinal_offset = 5; // 相对于目标的纵向偏差
  optional double speed_limit = 6;// 速度限制
}

对mission_points进行赋值的方法如下:

std::vector<VehicleMissionPoint> mission_points;
VehicleNavigationStage navigation_stage;

navigaion_stage.mutable_mission_points()->CopyFrom({
  mission_points.begin(), mission_points.end()});

2.将repeated类型的变量赋值给vector类型

在C++中通常用vector来存repeated类型的变量,所以将repeated类性的变量赋值给vector类型的变量也是常见的用法。

定义protobuf结构如下:

message VehicleNavigationStage {
  
  enum NavigationMode{
  
    STATIC_DESTINATION = 0;
    DYNAMIC_DESTINATION = 1;
    PATH_PATROLLING = 2;
  }
  optional NavigationMode navigation_mode = 1;// 导航的模式
  optional PointLLHA destination_point = 2;// 目标点
  repeated VehicleMissionPoint mission_points = 3;// 途经点
  optional double lateral_offset = 4;// 相对于目标的横向偏差
  optional double longitudinal_offset = 5; // 相对于目标的纵向偏差
  optional double speed_limit = 6;// 速度限制
}

将mission_points赋值给vector型变量的方法如下:

std::vector<VehicleMissionPoint> mission_points;
VehicleNavigationStage navigation_stage;

for (int i = 0; i < navigation_stage.mission_points_size(); i++) {
  
  mission_points.push_back(navigation_stage.mission_points(i));
  }