C ++错误:没有匹配函数来调用&#39; std :: vector <int> :: swap(std :: vector <int>)&#39;

时间:2016-10-29 01:10:22

标签: c++ vector swap

我正在阅读关于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;
}

2 个答案:

答案 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);