C++ STL
Vector
拷贝方法
vector<int> list;
// 1. initialization
vector<int> copy_(list);
// 2. assgin (copy)
copy_.assign(list.begin(),list.end());
// 3. swap, the original one is empty
copy_.swap(list);
// 4. insert, insert the original one into the new vector
copy_.insert(copy_.end(), list.begin(), list.end());
// the first argument can change to decide where to insert
.data()
returns the pointer to the first element.
vector 不论是 =
还是拷贝构造函数都是深拷贝。
初始化
// 默认值初始化
vector<float> mvuRight(N,-1.0f);
vector<vector<size_t> > vRowIndices(nRows,vector<size_t>());
// 预分配空间 .reserve() 方法
vector<pair<int, int> > vDistIdx;
vDistIdx.reserve(N);
内存管理
参考 cherno 的视频,讨论稿方法 .reserve
/ .push_back
/ .emplace_back
使用。
.reserve()
:当存入向量的元素数量超过分配的内存,向量会重新开辟新的内存,然后将旧的内容全部拷贝到新的内存中。为了避免多次拷贝,可以一开始就给向量分配内存。
// reserve 只是分配空间,但是没有初始化相应地址处的值
std::vector<int> vec;
vec.reserve(N);
// 初始化了 N 个实例
std::vector<int> vec(N);
.push_back
(all) & .emplace_back
(C++11 or newer)
.push_back
是先构造一个实例,然后将此实例拷贝到容器末尾。.emplace_back
是直接在容器的末尾构造对象。相比而言,.push_back
会多一次拷贝过程。
String
- 字符串替换
s.replace(pos, n, s1); // 用s1替换s中从pos开始(包括)的n个字符的子串