ChatGPT解决这个技术问题 Extra ChatGPT

使用 C++ vector::insert() 添加到向量的末尾

我正在编写一小段代码,我必须根据向量元素中的值在某个位置将值插入到 C++ STL 向量中。我正在使用 insert() 函数来完成此操作。我意识到当我想在向量末尾添加一个新元素时,我可以简单地使用 push_back()。但是为了让我的代码看起来不错,我想专门使用 insert(),它将指向所需插入点之后的元素的迭代器和要插入的值作为输入。如果作为参数传入的迭代器的值为 v.end(),其中 v 是我的向量,这是否与 push_back() 一样工作?

非常感谢!

如果您发现自己在向量中大量使用插入,则可能使用了错误的数据结构。考虑(例如)使用双端队列。当然,如果向量很小,就没有问题。
@尼克:是的。一个简单的实验就可以告诉你。
@Space我看不出实验怎么能告诉他。如果它无效,他会得到 UB,在这种情况下,他的程序很可能看起来可以工作。
@unapersson:只有当大多数插入位于序列的开头或结尾时,双端队列才会有帮助。如果它只是在序列的末尾,那么向量也会做得很好。
@unapersson 双端队列更适合在开头插入。对于除开头或结尾之外的任何地方的插入,几乎肯定会更糟(都是线性的,但双端队列将具有明显更大的常数因子)。并且插入到向量中间的成本经常被夸大,至少如果向量中的类型是 POD 类型。 (插入的真正“成本”通常是它使迭代器无效。只有 std::list 避免了这一点,但 std::list 否则会非常昂贵。)

D
Daniel

对于支持它的序列容器,a.push_back(x)定义为具有与 (void)a.insert(a.end(),x) 相同的语义。

参见 ISO/IEC 14882:2003 23.1.1/12 [lib.sequence.reqmts] 中的表 68。

https://i.stack.imgur.com/fHYx0.png

关于 vector.push_back(x)vector.insert(vector.end(), x) 的运行时间,请考虑强调的部分:

表 68 列出了为某些类型的顺序容器提供的顺序操作,但不为其他类型提供。实现应为“容器”列中显示的所有容器类型提供这些操作,并应实现它们以占用摊销常数时间。


快速提问,就性能而言,我想知道 pusk_back 是否工作得更快?我测试了一些显示插入有点慢的东西。我只是想确定...谢谢
push_back() 不会返回新插入元素的迭代器。 std::list::end() 将返回一个死迭代器。
如果您包括您参考的标准部分,答案会更好
@JonMcClung:嗯,但答案已经包含该信息?
我的意思是引用。我不知道如何从章节标记或您提供的任何内容中查找标准的随机部分。
n
neuront

push_back 返回 voidinsertiterator 返回到刚刚插入的元素之间存在细微差别。

顺便说一句,还有另一种方法可以验证它们是否做同样的事情:编译以下代码

int main()
{
    std::vector<int const> v;
    v.push_back(0);
    return 0;
}

编译器会打印出很多烦人的信息,只要阅读一下,最后你会发现 push_back 调用了 insert(如果没有,请尝试编译 v.insert(v.end(), 0) 以查看它们是否调用了相同的插入函数)。