了解std ::交换指针和std :: vectors
Understanding std::swap for both pointers and std::vectors
我有以下玩具示例:
#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
交换向量交换他们指的是什么;它不会交换内部的实际数据。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 了解std ::交换指针和std :: vectors
- 迭代一个巨大的 std::vector of std::vectors 并修改元素
- 创建一个动态分配的std::vectors数组
- 在 boost::spirit 中使用 auto_ 表达式和 std::vectors
- 是 std::vectors 线程安全的
- std::vector of std::vectors contiguity
- 如何在不使用std::vectors的情况下,使用运算符==从动态分配的对象数组中删除元素
- 在g++下使用带有std::vectors的move语义
- Boost Python导入一个带有std::vectors作为参数的c++函数
- std::vectors中的vector取消分配其shared_ptr内容(堆栈实体对象的使用不正确?)
- std::vectors in classes
- 简单的模板化函数,用于转换 std::vectors - "illegal use of this type as an expression"
- 有多少对象(包含 std::vectors)加载到 L1/L2/L3 缓存中
- std::vectors中size_type的更短表示法