我正在阅读关于std :: vector的博客。请参阅此website中的交换内容部分。
基本上,它说swap()
方法的一个常见应用是强制向量释放它所拥有的内存。但是在我运行下面的代码之后,我得到了错误Error: no matching function for call to 'std::vector<int>::swap(std::vector<int>)'|
。出了什么问题?
#include <iostream>
#include <vector>
int main( )
{
std::vector<int> v;
v.push_back(1); v.push_back(2);
v.clear();
v.swap(std::vector<int>(v));
return 0;
}
答案 0 :(得分:4)
std::vector::swap的参数类型是非常量左值引用(即vector&
)。但是std::vector<int>(v)
是一个临时对象,它不能绑定到非const引用。
这意味着当使用&#34;交换技巧&#34;时,你应该将临时放在左侧:
std::vector<int>(v).swap(v);
从C ++ 11开始,您可以使用std::vector::shrink_to_fit来请求删除未使用的容量;请注意,这是一个非约束性请求,效果取决于实现。
答案 1 :(得分:2)
std::vector::swap()
不接受临时对象作为输入。它将输入对象作为非常量左值引用(因此它可以修改输入对象)。 非常量左值参考 无法绑定到临时对象(仅 const左值参考或右值参考可以做到这一点),这就是你得到编译器错误的原因。
您还应该使用默认构造函数而不是 copy 构造函数,以确保原始vector
与空状态交换,并且临时vector
假定拥有原始分配的内存。
使用原始代码,您需要声明另一个vector
变量来交换:
std::vector<int> temp;
v.swap(temp);
否则,切换两个对象的顺序,这是首选方法:
std::vector<int>().swap(v);