Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将“U向后推()”;新";要添加到c+中的std::list之前的对象+; 我是C++标准库的新手。我想使用std::list。我知道如果我自己创建一个列表而不是使用stl,我应该为一个新对象分配内存,然后将其添加到列表中_C++_C++11_Gcc_Stl - Fatal编程技术网

是否将“U向后推()”;新";要添加到c+中的std::list之前的对象+; 我是C++标准库的新手。我想使用std::list。我知道如果我自己创建一个列表而不是使用stl,我应该为一个新对象分配内存,然后将其添加到列表中

是否将“U向后推()”;新";要添加到c+中的std::list之前的对象+; 我是C++标准库的新手。我想使用std::list。我知道如果我自己创建一个列表而不是使用stl,我应该为一个新对象分配内存,然后将其添加到列表中,c++,c++11,gcc,stl,C++,C++11,Gcc,Stl,a类的c样式列表: 如果我使用stl,是否有必要“新建”对象?PoSoBo后放()“新”对象之前添加到STD::C++中的列表? 下面的代码正确吗 aObj的值是否会以以下代码发布: push_back()实际上是做什么的 我看完后还是搞糊涂了, 谢谢您的时间。来自std::list的push_back方法将复制或移动您的参数 在内部,如何管理对象取决于实现。Astd::list可以包含对象或指向对象的指针 std::list<MyObj> list1; list.push_back

a类的c样式列表:

如果我使用stl,是否有必要“新建”对象?PoSoBo后放()“新”对象之前添加到STD::C++中的列表? 下面的代码正确吗

aObj的值是否会以以下代码发布:

push_back()实际上是做什么的

我看完后还是搞糊涂了,


谢谢您的时间。

来自
std::list
push_back
方法将复制或移动您的参数


在内部,如何管理对象取决于实现。

A
std::list
可以包含对象或指向对象的指针

std::list<MyObj> list1;
list.push_back(MyObj()); // push an anonymous object (rvalue)
MyObj a;
list.push_back(a); // push (copy) a

std::list<MyObj*> list2;
list2.push_back(new MyObj());
MyObj* b = new MyObj();
list2.push_back(b);
std::列表列表1;
list.push_back(MyObj());//推送匿名对象(右值)
MyObj a;
列表。向后推(a);//推(复印)一份
std::列表2;
列表2.推回(新的MyObj());
MyObj*b=新的MyObj();
清单2.推回(b);
list1
是MyObj的列表,清除该列表时,列表中的MyObj实例将被销毁,内存将被释放。
list2
是指针列表,清除该列表时,实例不会被销毁

push_back
在堆上创建参数的副本。但是
list2
是指针列表,因此只复制指针,而不复制对象本身


匿名对象(称为rvalue)由于其临时行为,可能会在列表中“移动”:内存未分配,但列表中的指针将指向已分配的内存。此行为取决于push_-back的类型和实现。

是,
std::list
中的
push_-back
使用
new
(或
malloc()
)在堆上创建一个新对象。它创建参数的副本


您的第二个代码片段是正确的<代码>aObj被复制


在第三个代码段中,
aObj
的副本将保留在列表中,而
aObj
本身将被删除。

如果容器的模板参数是POD类型,则
push_back
为其分配一个新的内存块,并使用传递的值进行初始化。如果模板参数是复杂数据类型a-ka类的对象,那么它也会被分配,然后通过复制构造函数调用实例化(复制构造函数的参数将是传递给
push_back
)的参数。

列表中有一个分配器。默认分配器只需调用
new
(正如您所期望的那样)。 如果合适,您可以提供备用分配器

由于您使用的是C++11,您可能会受益于
emplace\u back
,这将避免您产生的任何构造/移动/发布开销

emplace\u back
仍将调用分配器,但

或者,如果将值“移动”到:

list.push_back(std::move(v));

这是假设您已经在元素类型上定义了有用的移动语义。

这不是实现
a
的C风格列表的好方法。列表实现不应与
A
混合使用(除非在极少数性能敏感的情况下)。你不需要<代码>新< /Cord>创建像java一样的对象。因为你是C++新手,所以值得注意的是<>代码> STD::vector < /C>通常是默认的容器。代码>标准::列表是一个更好的选择,当你有更大的集合并且经常在随机位置插入/删除元素时。如果类a没有复制构造函数会怎么样。案例1)它是私有的->编译错误;案例2)未声明->将使用默认的复制构造函数(实际上这不是一个好主意)。因此,如果类a没有复制构造函数,它将被移动。
步骤1:使用MyObj()的大小分配内存。
步骤2:复制MyObj()到新内存区域
步骤3:列表中指向新内存区域的指针
是否向后推()执行这些步骤到匿名对象和命名对象?匿名对象(称为右值)由于其临时行为,可能会在列表中“移动”:内存未分配,但是列表中的指针将指向已经分配的内存。此行为取决于push_-back的类型和实现。
funcAddToList() {
    A aObj(value);     
    listA.push_back(aObj);
}
funcDispList() {
    // display listA  // Does the value of aObj still in list?
}
std::list<MyObj> list1;
list.push_back(MyObj()); // push an anonymous object (rvalue)
MyObj a;
list.push_back(a); // push (copy) a

std::list<MyObj*> list2;
list2.push_back(new MyObj());
MyObj* b = new MyObj();
list2.push_back(b);
list.push_back(std::move(v));