【问题标题】:Using C++ vector::insert() to add to end of vector使用 C++ vector::insert() 添加到向量的末尾
【发布时间】: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 否则非常昂贵。)

标签: c++ stl vector iterator


【解决方案1】:
对于支持它的序列容器,

a.push_back(x)定义(void)a.insert(a.end(),x) 具有相同的语义。

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

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

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

【讨论】:

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

push_back 返回 voidinsert 是否返回 iterator 到刚刚插入的元素略有不同。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2014-01-25
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多