http://www.cplusplus.com/reference/vector/vector/push_back/(C ++ 11 Version)
http://www.cplusplus.com/reference/vector/vector/pop_back/
答案 0 :(得分:3)
这应该向您展示如何使用它们。
<强>的push_back():强>
std::vector<int> vec = { 0, 1, 2 };
vec.push_back(3);
pop_back():
vec.pop_back();
vec.pop_back();
如果您需要更多说明:
push_back(const T& val)
将其参数添加到向量的末尾,如果向量容量将超过其大小,则有效地将大小增加1.
pop_back()
不接受任何参数并移除向量的最后一个元素,有效地将大小减小1.
<强>更新强>:
我试图逐一解决你的问题,如果有什么不清楚的地方,请告诉我。
void push_back(const value_type&amp; val)的区别和/或优点是什么? &安培; void push_back(value_type&amp;&amp; val)你建议我使用哪个?;
在C ++ 11之前,rvalue-references并不存在。这就是push_back
被vector.push_back(const value_type& val)
实施的原因。如果您有一个支持C ++ 11或更高版本的编译器,std::vector.push_back()
将被重载以进行const左值引用和右值引用。
我不明白如何填写参数(const value_type&amp; val)&amp; (value_type&amp;&amp; val)
作为程序员, NOT 选择如何将参数传递给push_back(),编译器会在大多数情况下自动为您执行此操作。
我不理解参数部分下的第二句话。 (这对我来说有点过于罗嗦)。我确实理解val是什么
value_type
等于您声明的向量的类型。如果向量是使用std::string
声明的,那么它只能保留std::string
。
std::vector<std::string> vec;
vec.push_back("str"); // Ok. "str" is allowed.
vec.push_back(12); // Compile-time error. 12 is not allowed.
答案 1 :(得分:3)
如果您是初学者,请阅读其他限定符,例如const,&amp;和&amp;&amp; STL中的方法以某种方式实现,它们在所有重载上表现一致:
我会在这里给你一个小例子:
std::vector<int> myvector;
myvector.push_back(5);
int five = 5;
myvector.push_back(five);
现在答案的深度部分是:
首先(const value_type& val)
。 &amp;字符信号,我们通过引用获取参数,这意味着我们不复制参数,而是获得一个花哨的指针,它将像对象本身一样。
如果将变量推回向量,您可能不希望变量被更改。为了得到STL的程序员的承诺,他不会在将变量推回向量时更改变量,他可以在类型之前添加const
。
以这种方式实现的原因是它可以防止不需要的副本。 (首先将参数复制到堆栈中以调用push_back
,然后第二次将其复制到向量中的位置。第一个副本是不必要的,并由const
引用保存。)
这一切都很简单,但有些情况下,不允许编译器获取值的引用并将其传递给函数。在临时值的情况下,没有引用,因为内存中没有变量。以下面一行为例。
myvector.push_back(5);
由于5
没有地址,因此无法作为参考传递。编译器不能使用该函数的第一个重载。但程序员也不想浪费时间将副本放到堆栈上。这就是为什么C ++ 11增加了新的语义。这种临时对象的所谓rvalue。如果要编写一个函数来获取这样的右值,可以使用type&& rvalue_variable
来完成。在这种情况下,5
的值通过使用该类型的移动构造函数移动到堆栈上。对于像int这样的普通类型,这将与复制构造函数相同。对于像std :: 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.
答案 2 :(得分:2)
void push_back(const value_type&amp; val); &amp; void push_back(value_type&amp;&amp; val),您建议我使用哪个?
void push_back(const value_type&)
接受一个参数,然后将其复制到vector
中。这意味着新元素被初始化为传递参数的副本,由适当的分配器定义。
void push_back(value_type&&)
接受一个参数,然后将其移入容器(这种类型的表达式称为 rvalue表达式)。
两者中任何一个的使用取决于您想要达到的结果。
我不明白如何填写参数(const value_type&amp; val)&amp; (value_type&amp;&amp; val)
在大多数情况下,您不应该考虑使用哪个版本,因为编译器会为您处理此问题。将为任何rvalue参数调用第二个版本,为其余参数调用第一个版本。在极少数情况下,如果要确保调用第二个重载,可以使用std::move
将参数表达式显式转换为xvalue(这是一种rvalues)。
我不明白参数部分下的第二句话。 (这对我来说太过冗长了)。我确实理解val是什么
有问题的句子是:
成员类型value_type是容器中元素的类型,在向量中定义为其第一个模板参数(T)的别名。
这意味着value_type
与vector
元素的类型相同。例如,如果您有vector<int>
,则value_type
与int
相同,vector<string>
value_type
为string
。
因为vector不是普通类型,而是模板,所以在定义变量时必须指定类型参数(在<>
之后进入尖括号vector
)。在vector
模板规范中,此类型参数T
的别名为value_type
:
typedef T value_type;
它没有给出一个我能真正理解的例子。我可以使用向量或一些视频链接获得其他示例,以更好地解释在实践中使用该功能吗?
你需要记住的主要事情是vector
表现得像一个简单的数组,但具有动态可变的大小和一些额外的信息,如它的长度。 push_back
只是一个在此伪数组末尾添加新元素的函数。当然,有很多微妙的细节,但在大多数情况下它们都是无关紧要的。
基本用法是这样的:
vector<int> v; // v is empty
v.push_back(1); // v now contains one element
vector<float> v2 { 1.0, 2.0 }; // v2 is now a vector with two elements
float f = v2.pop_back(); // v2 now has one element, and f is now equals 2.0
了解其工作原理的最佳方法是亲自尝试使用它。