c++ - 我究竟如何使用函数 push_back 和 pop_back()?我在下面的链接中查找了它们,但仍然不明白

标签 c++ function vector push-back

http://www.cplusplus.com/reference/vector/vector/push_back/ (C++11 版本)

  • void push_back (const value_type& val);void push_back (value_type&& val) 你建议我使用哪个?;
  • 我不明白如何填写参数(const value_type& val) & (value_type&& val)
  • 我不明白参数部分下的第二句。 (这对我来说有点太罗嗦了)。不过,我确实理解 val 是什么
  • 它没有给出一个我能真正理解的例子。我能否使用 vector 或一些视频链接获取其他示例,以更好地解释该功能在实践中的用法?

http://www.cplusplus.com/reference/vector/vector/pop_back/

  • 它没有给出一个我能真正理解的例子。我能否使用 vector 或一些视频链接获取其他示例,以更好地解释该功能在实践中的用法?

最佳答案

如果您是初学者,只需阅读额外的限定符,例如 const、& 和 &&。 STL 中的方法以某种方式实现,它们在所有重载上表现一致:

我举个小例子:

std::vector<int> myvector;
myvector.push_back(5);
int five = 5;
myvector.push_back(five);

现在是更深入的答案部分:

第一个 (const value_type& val)。 & 字符表示我们通过引用获取参数,这意味着我们不复制参数,而是获得一个奇特的指针,其行为类似于对象本身。 如果将变量推回 vector ,您可能不希望更改变量。为了得到 STL 程序员的 promise ,即他不会在将变量推回 vector 时更改您的变量,他可以在类型前添加 const

之所以以这种方式实现,是因为它可以防止不必要的复制。 (第一次将参数复制到堆栈上以调用 push_back,第二次将其复制到 vector 中的位置。第一次复制是不必要的,由 const 引用保存。 )

这一切都很好也很简单,但在某些情况下,不允许编译器获取值的引用并将其传递给函数。在临时值的情况下,没有引用可取,因为内存中没有变量。以下面这行为例。

myvector.push_back(5);

因为 5 没有地址,所以不能作为引用传递。编译器不能使用函数的第一个重载。但是程序员也不希望把时间浪费在复制到栈上。这就是 C++11 添加新语义的原因。此类临时对象的所谓右值。如果您想编写一个函数来获取这样的右值,您可以使用 type&& rvalue_variable 来实现。本例中的值 5 通过使用该类型的移动构造函数被移动到堆栈上。对于像 int 这样的普通类型,这将与复制构造函数相同。对于像 std::vector 这样的复杂类型,如果允许将临时对象分开,则可以采取一些捷径。在vector的情况下,不需要将vector中的所有数据复制到新位置,而是可以在新对象中使用旧vector的指针。

现在我们可以再看一遍这个例子:

std::vector<int> myvector;
myvector.push_back(5); // push_back(const int&) can't be applied. The compiler chooses push_back(int&&) for us
int five = 5;
myvector.push_back(five); // push_back(const int&) can be applied and is used by the compiler
// The resulting vector after this has the two values [5, 5]
// and we see, that we don't need to care about it.

关于c++ - 我究竟如何使用函数 push_back 和 pop_back()?我在下面的链接中查找了它们,但仍然不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42930198/

相关文章:

c - sizeof() 如何通过引用参数传递

C++ vector 迭代器 nth_element 编译错误

c++ - 'glutInitDisplayMode' 未在此范围内为 Windows 7 上的 C++ 中的 Qt 声明

c - 没有以前的原型(prototype)?

c++ - 用零填充 vector

c++ - 填充 std::vector 时出现错误分配错误

c++ - 对由排序数组组成的合并数组进行排序

c++ - 双重构造是未定义的行为吗?

c++ - 使用修改后的反向波兰表示法求解方程

swift - 快速简化功能