C++ 如果您希望在新插入的元素中添加迭代器,请将插入与放置_返回以将新元素追加到向量/列表

C++ 如果您希望在新插入的元素中添加迭代器,请将插入与放置_返回以将新元素追加到向量/列表,c++,list,vector,insert,emplace,C++,List,Vector,Insert,Emplace,我理解std::vector和std::list的insert和emplace\u back之间的一般区别。通常,每当我想附加一个元素时,我都会使用emplace\u back。对于某些应用程序,我需要附加元素,并有一个迭代器指向新附加的元素 通常,我会做一些类似的事情: // for a vector std::vector<T> v{store some stuff......}; v.emplace_back(new thing); auto it = v.end() - 1;

我理解
std::vector
std::list
insert
emplace\u back
之间的一般区别。通常,每当我想附加一个元素时,我都会使用
emplace\u back
。对于某些应用程序,我需要附加元素,并有一个迭代器指向新附加的元素

通常,我会做一些类似的事情:

// for a vector
std::vector<T> v{store some stuff......};
v.emplace_back(new thing);
auto it = v.end() - 1; // now it points to newly inserted element

// for a list
std::list<T> l{store some stuff......};
l.emplace_back(new thing);
auto it = l.end();
--it; // now it points to newly inserted element
//对于向量
向量v{存储一些东西……};
v、 重新安置(新事物);
自动it=v.end()-1;//现在它指向新插入的元素
//要一份清单
列表l{存储一些东西……};
l、 重新安置(新事物);
自动it=l.end();
--它;//现在它指向新插入的元素
但我想知道是否最好使用:

// for a vector
std::vector<T> v{store some stuff......};
auto it = v.insert(v.end(), new thing);

// for a list
std::list<T> l{store some stuff......};
auto it = l.insert(l.end(), new thing);
//对于向量
向量v{存储一些东西……};
autoit=v.insert(v.end(),新事物);
//要一份清单
列表l{存储一些东西……};
autoit=l.insert(l.end(),新事物);

我想如果
T
是POD,那么差别是可以忽略的。但是如果
T
是某个非POD,那么如果我最终想要将迭代器附加到新附加的项并获取迭代器,哪一个会更快?根据我的理解,您必须平衡使用
emplace
(与
insert
不同,它构造一个没有副本的就地对象)与使用
insert
的优点,后者实际上只是直接给我一个迭代器,似乎没有其他好处。对我来说,使用
emplace
似乎更快,因为增加迭代器的额外步骤比创建对象的副本要便宜得多?

我不知道对性能有什么影响(尽管我无法想象有什么不同),但是如果您想附加一个新元素并获取它的引用,你可以写

auto &r=v.emplace_back(a, b, c);
auto it=v.emplace(cend(v), a, b, c);
如果您希望在其上获得迭代器,可以编写

auto &r=v.emplace_back(a, b, c);
auto it=v.emplace(cend(v), a, b, c);
据我在文档中看到的,唯一的区别是返回类型


在使用插页和背面装饰方面,差异可以忽略不计。由于实现细节的原因,列表插入新元素总是更快,因为插入只涉及更改几个指针,而不是偶尔重新分配和复制一个全新的动态数组。我个人会使用emplace_back(),然后在下一行声明一个迭代器,这仅仅是因为它更易于阅读和理解,这可以在涉及此代码的某些内容被破坏时为您节省一些时间。

@FrançoisAndrieux刚刚修复了它(关于您的第一条评论)。第二条评论:是的,我知道它返回一个引用,但我特别需要迭代器。@FrançoisAndrieux抱歉,那是另一个打字错误。应该是
insert
“哪一个会更快”似乎是一个问题,可以通过自己选择两种方法的时间来轻松回答。这将为您提供更准确的答案,包括您实际的、具体的类和应用程序;与stackoverflow.com上的某个人仅仅猜测某个假设类和应用程序哪个更快相比,我不理解最后一部分
emplace()
insert()
那样返回迭代器,那么为什么不使用
autoit=l.emplace(l.end(),newthing)?哇,我不知道
向量
列表
容器的
放置
放置
之间存在差异。我真的认为他们添加了
emplace
(作为一个与
emplace\u back
)完全相同的函数)以实现统一的命名约定,因为其他容器(如堆栈、队列等)都是这样的。。。没有
向后放置