如何获取list<vector<T>>中的vector且避免数据拷贝?
避免拷贝获取list中vector的方法
你当前的代码会拷贝整个vector,确实没必要,有两种常用的无拷贝方案:
1. 直接使用引用/指针访问原元素
如果只是需要读取或修改list里的原vector,完全不需要拷贝,直接用引用绑定或者取指针就行:
引用方式(推荐)
list<vector<T>> alist; list<vector<T>>::iterator iter = alist.begin(); // 用引用直接绑定到list中的vector,无拷贝 vector<T>& vec = *iter;
之后对vec的所有操作都会直接作用在list里的原vector上,没有任何数据拷贝开销。
指针方式
list<vector<T>> alist; list<vector<T>>::iterator iter = alist.begin(); // 取原vector的指针,同样无拷贝 vector<T>* vec_ptr = &*iter;
通过指针vec_ptr访问原vector,效果和引用一致,只是语法上需要用->代替.。
2. 转移vector的所有权(移动语义)
如果不再需要list里的这个vector,可以用C++11引入的移动语义,把原vector的内存资源直接转移给新的vector,全程没有数据拷贝:
#include <utility> // 需要包含这个头文件使用std::move list<vector<T>> alist; list<vector<T>>::iterator iter = alist.begin(); // 移动原vector的资源到新vec,原vector会变为空状态 vector<T> vec = std::move(*iter);
这种方式适合你要把list里的vector“拿走”的场景,效率远高于拷贝,因为只是转移了内存指针等元数据,没有复制实际存储的元素。
内容的提问来源于stack exchange,提问作者heifeise
相关产品推荐
相关产品推荐

