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/