【问题标题】:Which C++ vector push_back is called for objects created inside a loop为循环内创建的对象调用哪个 C++ 向量 push_back
【发布时间】:2017-01-19 02:21:58
【问题描述】:

这是一个非常基本的问题,但我似乎无法理解这里发生的逻辑。考虑一下代码 sn-p:

class Board{
private:
    vector< vector<Cell> > allCells;
    int bheight;
    int bwidth;
public:
    Board(int width = 10, int height = 10){
        bheight = height; bwidth = width;
        allCells.resize(width);
        #loop for creating cell objects
        for(int i = 0; i < width; i++){
            allCells[i].reserve(height);
            for(int j = 0; j < height; j++){
                Cell aCell(i,j,0); #an object created inside a loop
                allCells[i].push_back(aCell); #push it into a vector
            }

        }
    }

此代码工作正常,即在退出构造函数后,向量(向量)allCells 中的所有对象仍存储适当的信息。我的问题是这是如何实现的?根据定义,vector.push_back 只有两种变体:

void push_back (const value_type& val);
void push_back (value_type&& val);

它不能调用第二个变体,因为临时的aCell 对象是一个左值对象。如果它调用第一个变体,那么它会推送 temporary 对象aCell,该对象在循环终止时被销毁。

感谢任何解释这背后发生的事情。

编辑:由于 Sam Varshavchik 和 songyuanyao 指出的错误而修复了代码

【问题讨论】:

  • 啊,所以第一个变体中的 push_back 对象不是创建的对象,而是由参数的复制构造函数创建的对象?
  • 糟糕,nvm,我看错了。对不起。
  • 这里发生的是未定义的行为和错误。使用哪个版本的push_back() 完全无关紧要。代码完全被破坏了。查看reserve()resize()之间的区别,找出你真正需要使用的。
  • @Sam Varshavchik 抱歉,这是一个错字,我复制并粘贴,通过几个文件修复了 sn-p 代码以在询问之前进行实验,并且错误潜入。resize() 在我的原始代码中.

标签: c++ vector overloading lvalue rvalue


【解决方案1】:

如果调用第一个变体,则推送临时对象aCell,该对象在循环终止时被销毁。

是的,第一个版本被调用,因为aCell 是一个左值。这很好,因为 push_backed 元素是从参数复制初始化的;它独立于局部变量aCell

将给定的元素值附加到容器的末尾。

1) 新元素被初始化为 value 的副本。

顺便说一句:当在 for 循环中使用 allCells[i] 时,您的代码具有未定义的行为,因为此时 allCells 仍然为空,它没有元素。注意reserve 不会改变大小但vector 的容量,但resize 会。

Board(int width = 10, int height = 10){
    bheight = height; bwidth = width;
    allCells.reserve(width);           // it should be allCells.resize(width) !!
    #loop for creating cell objects
    for(int i = 0; i < width; i++){
        allCells[i].reserve(height);
        for(int j = 0; j < height; j++){
            Cell aCell(i,j,0); #an object created inside a loop
            allCells[i].push_back(aCell); #push it into a vector
        }
    }
}

【讨论】:

  • 啊感谢您提供有关代码中错误的指针。刚刚修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2019-07-04
  • 1970-01-01
相关资源
最近更新 更多