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);
据我在文档中看到的,唯一的区别是返回类型
insert
“哪一个会更快”似乎是一个问题,可以通过自己选择两种方法的时间来轻松回答。这将为您提供更准确的答案,包括您实际的、具体的类和应用程序;与stackoverflow.com上的某个人仅仅猜测某个假设类和应用程序哪个更快相比,我不理解最后一部分emplace()
像insert()
那样返回迭代器,那么为什么不使用autoit=l.emplace(l.end(),newthing)代码>?哇,我不知道向量和列表容器的放置
和放置
之间存在差异。我真的认为他们添加了emplace
(作为一个与emplace\u back
)完全相同的函数)以实现统一的命名约定,因为其他容器(如堆栈、队列等)都是这样的。。。没有向后放置。