【发布时间】:2021-02-10 21:05:13
【问题描述】:
我了解insert 和emplace_back 对于std::vector 和std::list 之间的一般区别。通常,只要我想附加一个元素,我就会使用emplace_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
但我想知道它是否更好用:
// 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);
如果T 是 POD,我想差异可以忽略不计。但是,如果T 是一些非 POD,那么如果我最终想将迭代器附加并获取到新附加的项目,哪个会更快?根据我的理解,您必须平衡使用emplace 的优点,它构造一个没有副本的就地对象,不像insert,与使用insert 的优点,这实际上只是直接给我一个迭代器没有其他好处。对我来说,使用emplace 似乎会更快,因为增加迭代器的额外步骤比创建对象的副本要便宜得多?
【问题讨论】:
-
@FrançoisAndrieux 刚刚修复它(关于您的第一条评论)。关于第二条评论:是的,我知道它返回一个引用,但我特别需要迭代器。
-
@FrançoisAndrieux 抱歉,这是另一个错字。应该是
insert。 -
“哪一个会更快”似乎是一个问题,可以通过自己定时两种方法来轻松回答。这将为您提供更准确的答案,包括您的实际、具体的类和您的应用程序;而不是 stackoverflow.com 上的某个人只是猜测对于某些假设的类和应用程序哪个更快。
-
最后一部分没看懂。
emplace()与insert()一样返回一个迭代器,那么为什么不使用auto it = l.emplace(l.end(), new thing);?
标签: c++ list vector insert emplace