在 for 循环中使用 push_front 不会将成员永久添加到列表中

Using push_front in a for loop doesn't permanently add a member to the list

本文关键字:成员 添加 列表 front 循环 for push      更新时间:2023-10-16

我试图在我创建的类的列表上使用push_front()函数。我把它放在for循环中,但是每当循环将新成员插入到列表中时,它就会被自动销毁,我假设是因为它超出了作用域。我的问题是如何永久地添加这些项。

的例子:

class foo
{
public:
    foo(){std::cout << "creation" << std::endl;}
    ~foo(){std::cout << "destruction" << std::endl;}
    bool create() {return true;}
};
int main()
{
    std::list<foo> foolist(4);
    for (std::list<foo>::iterator i=foolist.begin(); i!=foolist.end(); i++)
    {
        foolist.push_front(foo());
    }
    return 0;
}

这是我得到的输出:

creation
creation
creation
creation
creation
destruction
creation
destruction
creation
destruction
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction

当这是我想要达到的:

creation
creation
creation
creation
creation
creation
creation
creation
destruction
destruction
destruction
destruction
destruction
destruction
destruction
destruction

让我们一行一行地遍历这个程序。

std::list<foo> foolist(4);

foo的默认构造函数被调用4次。

foolist.push_front(foo());

该语句运行4次。每次都默认构造一个foopush_front调用隐式定义的move构造函数,以便将这个临时foo对象移动到列表中。(如果还在c++ 03模式下,也可以使用复制构造函数。)您不会看到打印任何内容,因为它不是默认构造函数。在每次迭代结束时,临时foo被销毁。

    return 0;
}

列表现在包含8个foo,因此析构函数被调用8次。

额外的"创建"answers"销毁"是由于您通过调用

创建的临时变量
foo()

这些临时变量被复制到列表中的新项目中,这些新项目也会在调用push_front时创建,并在列表超出作用域时销毁