【发布时间】:2011-08-23 02:10:01
【问题描述】:
我正在编写一小段代码,我必须根据向量元素中的值将值插入到 C++ STL 向量中的某个位置。我正在使用insert() 函数来完成此操作。我意识到当我想在向量的末尾添加一个新元素时,我可以简单地使用push_back()。但是为了让我的代码看起来不错,我想专门使用insert(),它将指向所需插入点之后的元素的迭代器和要插入的值作为输入。如果作为参数传入的迭代器的值是v.end(),其中v 是我的向量,这是否与push_back() 一样工作?
非常感谢!
【问题讨论】:
-
如果你发现自己在向量中使用了很多插入,你可能使用了错误的数据结构。考虑(例如)使用双端队列。当然,如果向量很小,就没有问题。
-
@Nick:会的。一个简单的实验就可以告诉你。
-
@Space 我看不出实验怎么能告诉他这一点。如果它无效,他会得到 UB,在这种情况下,他的程序很可能看起来可以工作。
-
@unapersson:只有当大多数插入位于序列的开头或结尾时,双端队列才有帮助。如果它只是在序列的末尾,那么向量也一样好。
-
@unapersson 双端队列更适合在开头插入。对于除开头或结尾之外的任何地方的插入,几乎肯定会更糟(都是线性的,但双端队列将具有显着更大的常数因子)。并且插入到向量中间的成本经常被夸大,至少如果向量中的类型是 POD 类型。 (插入的真正“成本”通常是它使迭代器无效。只有
std::list避免了这种情况,但std::list否则非常昂贵。)