c++ - 为什么 push_back 签名是 void push_back (const value_type& val) 而不是 void push_back (value_type val)?

标签 c++ stl

<分区>

为什么push_back的函数签名如下?

void push_back (const value_type& val);

传递的值被复制到容器中,为什么不直接复制到参数列表中呢?

void push_back (value_type val);

最佳答案

答案是避免制作另一个拷贝。看看这个简单的例子,它说明了使用 value_typeconst value_type& 之间的区别。

#include <iostream>
using namespace std;

struct A
{
   A() {}

   A(A const& copy)
   {
      cout <<  "Came to A::A(A const& copy)\n";
   }

   void print() const
   {
      cout << "Came to A:print()\n";
   }

};

void foo(A const& a)
{
   A copy = a;
   copy.print();
}


void bar(A a)
{
   A copy = a;
   copy.print();
}

int main()
{
   A a;
   foo(a);
   bar(a);
}

运行程序的输出:

Came to A::A(A const& copy)
Came to A:print()
Came to A::A(A const& copy)
Came to A::A(A const& copy)
Came to A:print()

请注意由于调用 bar 而对复制构造函数的额外调用。对于某些对象,当操作执行数百万次时,额外的复制构造和相应的销毁可能会非常昂贵。

关于c++ - 为什么 push_back 签名是 void push_back (const value_type& val) 而不是 void push_back (value_type val)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799174/

相关文章:

c++ - 用一个字符替换字符串中的多个字符

c++ - 对象 vector

c++ - "base operand of ‘->’ 有非指针类型”但它是指针

c++ - std::set 和 std::vector 有什么区别?

c++ - 我试图删除文本文件中的一行时留下回车符

c++ - 使用FFmpeg或OpenAL的音频均衡器

c++:查找程序中的最大容器

c++ - 如何使多个整数通过多个函数?

c++ - 如何从 rapidjson::Document 获取中文 wstring?

c++ - 按值与按引用的 STL 容器对象