本次更新主要引入了智能指针(std::unique_ptr)来管理内存,替代了原来的手动内存管理方式,具体更新点如下:
- 使用
std::unique_ptr<Type[]>来管理_data数组,确保在对象生命周期结束时自动释放内存,避免了手动delete[]可能带来的内存泄漏问题。 - 同样使用
std::unique_ptr<Type>来管理_sum和_mean指针,保证在对象析构时自动释放内存。
- 智能指针的使用简化了析构函数、拷贝构造函数和赋值运算符的实现,避免了手动内存管理的复杂性。
- 自动内存释放机制提高了代码的安全性,减少了因忘记释放内存而导致的潜在错误。
以下是部分使用智能指针更新后的代码示例:
// 构造函数中使用智能指针初始化 _data
explicit enhanced_vector(const int &size = 0, const Type &value = Type()) {
_size = size;
int tmp = 5;
while ((1 << tmp) <= _size) {
tmp++;
}
_capacity = (1 << tmp);
_data = std::make_unique<Type[]>(_capacity);
std::fill(_data.get(), _data.get() + _size, value);
if (std::is_integral_v<Type> || std::is_floating_point_v<Type>) {
_check = true;
_sum = std::make_unique<Type>(0);
_mean = std::make_unique<Type>(0);
for (size_t i = 0; i < _size; ++i) {
*_sum += _data[i];
}
if (_size == 0) {
*_mean = 0;
}
else {
*_mean = *_sum / _size;
}
}
else {
_check = false;
}
}Enhanced Vector 是一个扩展和修改了C++标准库中std::vector功能的容器类,提供了增强的向量操作和数值计算功能。此类库专为学习和实验目的设计,提供了标准vector的基本功能,同时添加了一些额外特性。
-
构造与析构
- 默认构造函数:
enhanced_vector(const int &size = 0, const Type &value = Type()) - 迭代器区间构造:
enhanced_vector(iterator first, iterator last) - 拷贝构造函数:
enhanced_vector(const enhanced_vector &other) - 移动构造函数:
enhanced_vector(enhanced_vector &&other) - 赋值运算符:
operator=(拷贝和移动版本) - 析构函数:
~enhanced_vector()
- 默认构造函数:
-
元素访问
- 下标操作:
operator[] - 首元素访问:
front() - 尾元素访问:
back()
- 下标操作:
-
迭代器
- 正向迭代器:
begin(),end() - 常量迭代器:
cbegin(),cend() - 反向迭代器:
rbegin(),rend() - 常量反向迭代器:
crbegin(),crend()
- 正向迭代器:
-
容量操作
- 大小查询:
size() - 容量查询:
capacity() - 判断是否为空:
empty() - 调整大小:
resize(const int &new_size),resize(const int &new_size, const Type &value) - 预留空间:
reserve(const int &new_capacity) - 收缩到适合大小:
shrink_to_fit()
- 大小查询:
-
修改操作
- 尾部添加元素:
push_back(const Type &value) - 尾部移除元素:
pop_back() - 头部添加元素:
push_front(const Type &value) - 头部移除元素:
pop_front() - 插入元素:
insert(iterator pos, const Type &value) - 删除元素:
erase(iterator pos),erase(iterator first, iterator last) - 清空容器:
clear() - 赋值:
assign(iterator first, iterator last),assign(const int &size, const Type &value)
- 尾部添加元素:
-
数值操作(仅适用于数值类型)
- 求和:
sum() - 求平均值:
mean()
- 求和:
-
向量运算
- 向量加法:
operator+(数值类型执行对应位置元素相加,非数值类型执行拼接) - 向量减法:
operator-(仅适用于数值类型) - 向量内积:
operator*(仅适用于数值类型) - 向量拼接:
operator+=
- 向量加法:
-
比较操作
- 相等比较:
operator==,operator!= - 大小比较:
operator<,operator<=,operator>,operator>=
- 相等比较:
-
输入输出
- 输出流:
operator<< - 输入流:
operator>> - 打印功能:
print(iterator first, iterator last)
- 输出流:
- 提供了动态数组的基本功能
- 支持随机访问、迭代器操作
- 提供了大部分标准容器所需的成员函数
- 双端操作:除了
push_back和pop_back外,还提供了push_front和pop_front操作 - 数值统计:对数值类型提供了求和和求平均值功能
- 向量运算:支持向量加法、减法和内积运算
- 容量控制:使用2的幂次方扩容策略
- 输出格式化:提供了格式化输出功能
- 功能整合:结合了
vector和部分deque的功能 - 数学运算:内置数值计算功能,适合数据分析场景
- 数据感知:自动识别数值类型并提供相应操作
- 友好接口:提供了直观的打印和流操作接口
-
性能开销:
push_front和pop_front操作需要移动所有元素,时间复杂度为O(n)- 数值统计功能需要额外存储和计算开销
- 某些操作可能导致不必要的内存重分配
-
内存管理:
- 使用固定的幂次方扩容策略,可能造成内存浪费
addCapacity方法中存在内存泄漏问题(临时数组_temp_data未正确初始化)
-
设计限制:
- 向量运算仅支持数值类型
- 缺少一些现代C++容器的高级功能(如
emplace系列操作) - 未实现移动语义优化的插入操作
-
安全性:
- 部分操作缺少边界检查
- 重载运算符时缺少类型安全检查
#include "enhanced_vector.hpp"
#include <iostream>
int main() {
// 创建整数向量
enhanced::enhanced_vector<int> vec1(5, 10); // 创建包含5个值为10的元素的向量
// 添加元素
vec1.push_back(20);
vec1.push_front(5);
// 打印向量
std::cout << "vec1: " << vec1 << std::endl;
// 数值计算
std::cout << "Sum: " << vec1.sum() << std::endl;
std::cout << "Mean: " << vec1.mean() << std::endl;
// 创建另一个向量
enhanced::enhanced_vector<int> vec2(vec1.size(), 1);
// 向量运算
auto vec3 = vec1 + vec2;
std::cout << "vec1 + vec2: " << vec3 << std::endl;
int dot_product = vec1 * vec2;
std::cout << "vec1 * vec2 (dot product): " << dot_product << std::endl;
return 0;
}文件中包含libenhanced.a,以下是链接和使用该库的示例:
project/
├── include/
│ └── enhanced_vector.hpp
├── lib/
│ └── libenhanced.a
└── src/
└── main.cpp
# 在项目根目录下执行以下命令编译程序
g++ -o myprogram src/main.cpp -I./include -L./lib -lenhanced -std=c++17#include <enhanced_vector.hpp>
#include <iostream>
#include <vector>
// 示例:使用enhanced_vector进行数据分析
void analyze_data(const std::vector<double>& raw_data) {
// 将std::vector数据转换到enhanced_vector
enhanced::enhanced_vector<double> enhanced_data;
for (const auto& value : raw_data) {
enhanced_data.push_back(value);
}
// 使用enhanced_vector的增强功能
std::cout << "数据集: " << enhanced_data << std::endl;
std::cout << "数据量: " << enhanced_data.size() << std::endl;
std::cout << "数据总和: " << enhanced_data.sum() << std::endl;
std::cout << "数据平均值: " << enhanced_data.mean() << std::endl;
// 创建另一个数据集进行对比
enhanced::enhanced_vector<double> baseline(enhanced_data.size(), 1.0);
// 计算差异
auto difference = enhanced_data - baseline;
std::cout << "与基准的差异: " << difference << std::endl;
// 计算内积(可用于相似度计算)
double dot = enhanced_data * baseline;
std::cout << "与基准的内积: " << dot << std::endl;
}
int main() {
// 示例数据
std::vector<double> measurements = {1.2, 3.4, 2.5, 4.6, 3.7, 5.8};
// 分析数据
analyze_data(measurements);
return 0;
}如果使用CMake构建系统,可以使用以下CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(EnhancedVectorDemo)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 指定头文件目录
link_directories(${CMAKE_SOURCE_DIR}/lib)
# 指定库文件目录
include_directories(${CMAKE_SOURCE_DIR}/include)
# 添加可执行文件
add_executable(${PROJECT_NAME} main.cpp)
# 链接静态库
target_link_libraries(${PROJECT_NAME} enhanced_vector.a)- 修复内存管理问题,特别是
addCapacity方法中的内存泄漏 - 优化
push_front和pop_front操作,考虑使用双向缓冲区或环形缓冲区实现 - 添加更多现代C++容器特性,如
emplace系列操作 - 提高类型安全性和边界检查
- 考虑使用更灵活的内存扩容策略
- 添加更多数值计算功能(如标准差、中位数等)
- 实现更完善的异常处理机制