You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过vector的shared_ptr向其中push_back circle结构体元素

解决std::shared_ptr<std::vector>的push_back操作问题

要给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的问题,你的代码还有两处需要注意的错误:

  1. 循环越界:
    原循环条件i < LocalStringArray->getSize() + 1会导致访问超出数组范围,正确的条件应该是i < LocalStringArray->getSize(),因为数组索引从0开始,到size-1结束。

  2. 类型不匹配:
    你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:57:07