如何通过vector的shared_ptr向其中push_back circle结构体元素
要给std::shared_ptr<std::vector<circle>>指向的vector添加元素,有两种直接可行的方式:
方法1:解引用智能指针后调用push_back
通过*解引用智能指针,获取到底层的std::vector<circle>对象,再调用其push_back成员函数:
(*MyCircles).push_back(Circle1);
方法2:直接使用智能指针的->运算符
std::shared_ptr重载了->运算符,可以直接用来访问指向对象的成员函数,写法更简洁:
MyCircles->push_back(Circle1);
额外需要修正的代码问题
除了push_back的问题,你的代码还有两处需要注意的错误:
循环越界:
原循环条件i < LocalStringArray->getSize() + 1会导致访问超出数组范围,正确的条件应该是i < LocalStringArray->getSize(),因为数组索引从0开始,到size-1结束。类型不匹配:
你的circle结构体中SpeedX和SpeedY是int类型,但代码中用std::stof将字符串转成float后赋值,会自动截断小数部分丢失精度。建议根据需求调整:- 如果速度需要保留小数,将结构体中的
SpeedX、SpeedY类型改为float或double; - 如果确实需要整数速度,改用
std::stoi转换(注意输入的浮点数会被截断)。
- 如果速度需要保留小数,将结构体中的
修正后的完整函数代码
void FindCircles(std::shared_ptr<DynamicArray<std::string>> LocalStringArray, std::shared_ptr<std::vector<circle>> MyCircles) { // 修正循环条件,避免越界 for (size_t i = 0; i < LocalStringArray->getSize(); i++) { std::string ConfigElement = LocalStringArray->get(i); std::vector<std::string> result = splitString(ConfigElement, ' '); if (result[0] == "Circle") { circle Circle1; Circle1.name = result[1]; Circle1.PosX = std::stoi (result[2]); // 假设调整SpeedX为float类型,对应stof转换 Circle1.SpeedX = std::stof (result[4]); Circle1.PosY = std::stoi (result[3]); Circle1.SpeedY = std::stof (result[5]); Circle1.ColorR = std::stoi (result[6]); Circle1.ColorG = std::stoi (result[7]); Circle1.ColorB = std::stoi (result[8]); Circle1.Radius = std::stoi (result[9]); // 使用->直接调用push_back MyCircles->push_back(Circle1); } } }
内容的提问来源于stack exchange,提问作者Jan-Willem Steenbergen
相关产品推荐
相关产品推荐

