【问题标题】:Want to simplify my std::vector push_back usage想简化我的 std::vector push_back 使用
【发布时间】:2019-08-15 11:51:48
【问题描述】:

我开始在 c++ 中使用 std::vector 并且想知道是否有更好的方法来编写我的代码。

我尝试直接使用 push_back(本问题末尾的示例),但看起来我无法在 push_back 函数中使用类函数。

这是我要优化的主要部分:

ShopTower st_temp;
    vector<ShopTower> shopTower;
    st_temp.set("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1);
    shopTower.push_back(st_temp);
    st_temp.set("Cannon Tower", "images/tower/cannontowerBuy.png", 30, 30, 2);
    shopTower.push_back(st_temp);
    ...

和我的设置函数:

void set(string aName, string aAdr, int aH, int aW, int aNr){
            name = aName;
            adr = aAdr;
            size.set(aH,aW);
            setAtBottom(20+((aNr-1)*(aW+20)), 20);
        }

为了说明清楚,size.set 是一个简单的 height=ah width=aw 函数,setAtBottom 基本相同,只是设置了从左下角开始计数的位置。

如果可能的话,我想删除 st_temp 变量并将我的代码重写为这样的:

    shopTower.push_back(set("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1));

【问题讨论】:

  • 为了清楚起见,您应该添加 minimal reproducible example 并解释“似乎不起作用”的含义
  • 如果您修改 ShopTower 的构造函数以获取您需要的所有参数。你可以做 shopTower.push_back(ShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1));
  • @rafaelgonzalez 请使用答案部分的答案。评论无法投票,您的解决方案相当不受欢迎,OP 要求优化,您建议他们创建一个不必要的实例并复制它,这远非最佳
  • @foreknownas_463035818 我希望我的编辑版本是规则确认 - 我实际上认为我的代码示例是最小的可重现示例,如果需要我会添加课程,但我认为因为它应该是最小的我的设置函数解释我上课的内容。我还需要发布我的班级父母,因为 shoptower : myobject 包含类 size(w,h) 和 pos(x,y)。如果它仍然不符合我将尝试再次编辑我的帖子。
  • 您的示例仍然无法重现,因为您可以复制并编译它,但至少现在您清楚了“不工作”的含义,并且该示例足以说明原因。

标签: c++ arrays function vector


【解决方案1】:

听起来你想要emplace_back。如果您还没有,则需要有一个构造函数 ShopTower::ShopTower(string aName, string aAdr, int aH, int aW, int aNr)

shopTower.emplace_back("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1);
shopTower.emplace_back("Cannon Tower", "images/tower/cannontowerBuy.png", 30, 30, 2);

【讨论】:

  • 谢谢 - 这是完美的!
【解决方案2】:

直接的方法是在ShopTower 类上创建一个构造函数,然后在push_backemplace_back - 正如已在接受的答案answer 中指出的那样。

如果出于某种原因无法选择(即,您不能或不会添加合适的构造函数) - 那么您可以创建一个工厂函数创建对象

ShopTower createShopTower(string aName, string aAdr, int aH, int aW, int aNr);

并使用任一:

shopTower.push_back(createShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1));

或使用std::move 以避免多余的副本:

shopTower.emplace_back(std::move(createShopTower("Bow Tower", "images/tower/bowtowerBuy.png", 30, 30, 1)));

【讨论】:

    【解决方案3】:

    如果您从 set() 函数返回(引用)您的对象,您的尝试将起作用:

    ShopTower& set(/* args */) {
        /* do the setting */
        return *this;
    }
    

    但是在这里重用单个对象确实没有¹好处,所以每次只需 emplace_back() 一个新对象。


    ¹除非 ShopTower 的某些内容您没有与我们共享并且需要在所有内容中通用(问题是缺乏良好的 MCVE)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-15
      • 2021-06-18
      • 2023-03-21
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多