了解std ::交换指针和std :: vectors

Understanding std::swap for both pointers and std::vectors

本文关键字:std vectors 交换 了解 指针      更新时间:2023-10-16

我有以下玩具示例:

#include<iostream>
#include<vector>

int main(){

    std::vector<int> a={1, 2, 3};
    std::vector<int> b={4, 5, 6};
    int* pa = a.data();
    int* pb = b.data();
    std::swap(pa,pb);
    std::cout<<"after std::swap(pa,pb)n";
    std::cout<<"a= "<<a[0]<<" "<<a[1]<<" "<<a[2]<<"n";
    std::cout<<"b= "<<b[0]<<" "<<b[1]<<" "<<b[2]<<"n";
    std::cout<<"pa= "<<pa[0]<<" "<<pa[1]<<" "<<pa[2]<<"n";
    std::cout<<"pb= "<<pb[0]<<" "<<pb[1]<<" "<<pb[2]<<"n";
    std::swap(a,b);
    std::cout<<"after std::swap(a,b)n";
    std::cout<<"a= "<<a[0]<<" "<<a[1]<<" "<<a[2]<<"n";
    std::cout<<"b= "<<b[0]<<" "<<b[1]<<" "<<b[2]<<"n";
    std::cout<<"pa= "<<pa[0]<<" "<<pa[1]<<" "<<pa[2]<<"n";
    std::cout<<"pb= "<<pb[0]<<" "<<pb[1]<<" "<<pb[2]<<"n";
}

互换(PA,PB)后会发生什么,我希望PA指向b.data(),但是交换后(a,b)之后,我希望b.data()现在指向" 1 23",但是当打印出PA [0],PA [1],PA [2] ...

时,情况并非如此

http://en.cppreference.com/w/cpp/container/vector/vector/swap指出:

所有迭代器和参考文献仍然有效。过去的迭代器无效。

这意味着内存分配保持不变,向量字段交换

  std::vector<int> a={1, 2, 3}; // data lays at pa
  std::vector<int> b={4, 5, 6}; // data lays at pb
  int* c = a.data(); // == pa
  int* d = b.data(); // == pb
  std::swap(c,d); // c == pb, d == pa
  std::cout<<"after std::swap(c,d)n";
  std::cout<<"a= "<<a[0]<<" "<<a[1]<<" "<<a[2]<<"n";
  std::cout<<"b= "<<b[0]<<" "<<b[1]<<" "<<b[2]<<"n";
  std::cout<<"c= "<<c[0]<<" "<<c[1]<<" "<<c[2]<<"n";
  std::cout<<"d= "<<d[0]<<" "<<d[1]<<" "<<d[2]<<"n";
  std::swap(a,b); // c == pb, d == pa, a == pb, b == pa
  std::cout<<"after std::swap(a,b)n";
  std::cout<<"a= "<<a[0]<<" "<<a[1]<<" "<<a[2]<<"n";
  std::cout<<"b= "<<b[0]<<" "<<b[1]<<" "<<b[2]<<"n";
  std::cout<<"c= "<<c[0]<<" "<<c[1]<<" "<<c[2]<<"n";
  std::cout<<"d= "<<d[0]<<" "<<d[1]<<" "<<d[2]<<"n";

倾向于用指向数据的指针实现向量。因此,假设在内存中有一个名为foo的位置, {1, 2, 3}bar的起始位置,{4, 5, 6}

的起始位置
std::vector<int> a={1, 2, 3};
std::vector<int> b={4, 5, 6};

a是一个指向foo
的指针的向量 b是一个指向bar

的指针的向量
int* c = a.data();
int* d = b.data();

c是一个指向a的指向当前指向的指针;foo
d是一个指向b的指针当前指向的指针;bar

现在,让我们进行一些交换...

std::swap(c, d);

c是一个指针,现在指向d指向的指针;bar
d是一个指针,现在指向c指向的指针;foo
因此,c现在将指向{4, 5, 6}d现在指向{1, 2, 3}

std::swap(a, b);

a的指针现在指向b的指向指向的指向;bar
b的指针现在指出了a的指向什么。foo
交换向量交换他们指的是什么;它不会交换内部的实际数据。