-
预分配空间:使用 reserve() 方法预分配 vector 的空间,避免频繁的内存分配和拷贝操作。
-
使用 emplace_back():使用 emplace_back() 方法插入元素,避免了拷贝构造函数的调用,提高了插入效率。
-
使用移动语义:使用移动语义避免了拷贝构造函数和拷贝赋值运算符的调用,提高了元素的插入和删除效率。
-
使用 shrink_to_fit():使用 shrink_to_fit() 方法释放 vector 中多余的空间,减少内存占用。
-
使用迭代器遍历元素:使用迭代器遍历 vector 的元素,可以避免使用下标访问时的边界检查和拷贝操作,提高遍历效率。
-
使用局部变量存储 vector 的元素:在函数内部使用 vector 时,可以将 vector 的元素存储在局部变量中,避免频繁的内存分配和拷贝操作。
-
使用 vector 替代 bool 数组:vector 是专门针对 bool 类型进行优化的容器,可以将多个 bool 值压缩为一个字节存储,减少内存占用。
-
使用指针或引用访问元素:使用指针或引用访问 vector 的元素,可以避免拷贝操作,提高访问效率。
-
使用 std::move():使用 std::move() 将元素从一个 vector 移动到另一个 vector,避免了拷贝构造函数和拷贝赋值运算符的调用,提高了元素的移动效率。
-
使用 std::vector::data():使用 std::vector::data() 方法获取 vector 的底层数据指针,可以避免拷贝操作,提高访问效率。
具体解释:
1.
使用 reserve() 方法可以在不改变 vector 元素数量的情况下,预留一定的空间,避免频繁的内存分配和拷贝操作。reserve() 方法的使用方法如下:
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve(100); // 预留 100 个元素的空间
// 插入元素
for (int i = 0; i < 100; ++i) {
vec.push_back(i);
}
return 0;
}
在上面的代码中,我们使用 reserve() 方法预留了 100 个元素的空间,然后使用 push_back() 方法插入了 100 个元素。由于预留了足够的空间,vector 不需要频繁地进行内存分配和拷贝操作,提高了插入效率。
需要注意的是,reserve() 方法只会预留空间,不会改变 vector 的元素数量。如果在预留空间后,直接使用下标访问 vector 的元素,可能会访问到未初始化的内存,导致程序出错。因此,在使用 reserve() 方法时,需要确保在插入元素之前,vector 的元素数量不会超过预留的空间。
使用 shrink_to_fit() 方法可以释放 vector 中多余的空间,将 vector 的容量缩小到与元素数量相等的大小。shrink_to_fit() 方法的使用方法如下:
#include <vector>
int main() {
std::vector<int> vec;
vec.reserve(100); // 预留 100 个元素的空间
// 插入元素
for (int i = 0; i < 100; ++i) {
vec.push_back(i);
}
vec.shrink_to_fit(); // 释放多余的空间
return 0;
}
在上面的代码中,我们使用 reserve() 方法预留了 100 个元素的空间,然后使用 push_back() 方法插入了 100 个元素。最后,我们使用 shrink_to_fit() 方法释放了多余的空间,将 vector 的容量缩小到与元素数量相等的大小。
需要注意的是,shrink_to_fit() 方法只会释放多余的空间,不会改变 vector 的元素数量。如果在释放空间后,继续插入元素,vector 可能会重新分配内存空间,导致之前的优化失效。因此,在使用 shrink_to_fit() 方法时,需要确保 vector 不再需要扩容。