首页 > 解决方案 > c++交换全局和局部向量?

问题描述

我想交换一个全局向量和一个局部向量,我的问题是局部向量在他的堆栈上。交换运算符将通过指针交换两个向量,所以交换后全局向量将指向局部向量,即在堆栈上。

当离开作用域时,本地向量将被释放,我知道向量的内容被交换,但y在堆栈上,为什么离开作用域x后仍然有效,之后将重新释放。这是怎么做到的?funcy

#include <iostream>
#include <vector>

using namespace std;

vector<int> x = {2, 3, 4};

void func() {
    vector<int> y = {1, 2, 3};
    cout << "y before: " << &y << endl;
    x.swap(y);
    cout << "y after: " << &y << endl;
}

int main()
{
    cout << "x before: " << &x << endl;
    func();
    cout << "x after: " << &x << endl;
    return 0;
}

标签: c++swap

解决方案


“交换运算符将通过指针交换两个向量” - 的实现细节swap并不是你真正关心的。但是您似乎对正在交换哪个指针(如果有的话)感到困惑。

我可以肯定地说,指针 &y不是交换的。您的func()调用将在交换前后显示完全相同的指针值,因为y它是堆栈上的一个对象。同样,&xwhich 指向全局范围级别的对象。

在内部vector,存储值的实际内存可能会被交换,因为两个向量共享相同的(默认)分配器,因此允许简单地切换指针以提高效率。但是持有它们的实际矢量对象绝对不会在内存中切换位置。

如果要检查内存是否被交换,那么可以输出data()成员函数返回的指针:

cout << "x before: " << x.data() << endl;
x.swap(y);
cout << "x after: " << x.data() << endl;

推荐阅读