【问题标题】:Insert vs. emplace_back for appending new element to vector/list if you want an iterator to the newly inserted element如果您想要一个迭代器到新插入的元素,则插入与 emplace_back 用于将新元素附加到向量/列表
【发布时间】:2021-02-10 21:05:13
【问题描述】:

我了解insertemplace_back 对于std::vectorstd::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


【解决方案1】:

我不知道对性能有什么影响(虽然我无法想象有什么区别)但是如果你想追加一个新元素并获得它的引用,你可以写

auto &r=v.emplace_back(a, b, c);

如果你想获得一个迭代器,你可以写

auto it=v.emplace(cend(v), a, b, c);

据我在文档中看到的,唯一的区别是返回类型。

【讨论】:

  • 哇,我不知道emplaceemplace_back 对于vectorlist 容器之间存在差异。我真的认为他们添加了emplace(作为与emplace_back 完全相同的功能)用于统一命名约定的目的,因为堆栈、队列等其他容器......没有emplace_back。跨度>
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多