Files
blackbird/core/include/cn/向量.hpp
T
2026-07-20 11:12:29 +08:00

129 lines
3.7 KiB
C++

#pragma once
#include "中文化.hpp"
#include "异常.hpp"
命名空间 中文标准 {
模板 <类型名 类型1>
类 向量{
公开的:
/* 注意:当长度单位为0时,内部指针是空的 */
向量() {
对象->指针 = 空指针;
对象->容量 = 0;
}
/* 专门用于处理花括号初始化列表 */
向量(常量 std::initializer_list<类型1>& init = {}) {
对象->指针 = 新建 类型1[init.size()] {空的};
对象->容量 = init.size();
长度单位 计数 = 0;
计次循环(适应 & 东西: init) {
对象->指针[计数++] = 东西;
}
}
~向量() {
删除 对象->指针;
对象->指针 = 空指针;
对象->容量 = 0;
}
/*----------访问器----------*/
长度单位 取容量() {
返回 对象->容量;
}
布尔 是否为空() {
返回 对象->容量 等于 0;
}
/*--------运算符重载--------*/
向量& _取下标重载( 常量 长度单位 下标 ) {
如果(下标 < 0 或 下标 >= 对象->容量)
抛出异常 下标越界{"向量", 对象->容量, 下标};
返回 对象->指针[下标];
}
/*--------可范围遍历--------*/
类型1* _开始() {
返回 对象->指针;
}
类型1* _结束() {
返回 对象->指针 + 对象->容量;
}
/*----------变异器----------*/
空类型 插入元素(常量 长度单位 位置, 常量 向量& 媒介) {
/* 越界检查 */
如果(位置 < 0 或 位置 > 对象->容量)
抛出异常 下标越界{"向量元素插入", 对象->容量+1, 位置};
适应 长度 = 取容量();
适应 新的 = 新建 类型1[长度 + 1] { 空的 };
/* 插入位置之前 */
计次循环(适应 计数 = 0; 计数 < 位置; ++计数)
新的[计数] = 对象->指针[计数];
/* 执行插入 */
新的[位置] = 媒介;
/* 插入位置之后 */
计次循环(适应 计数 = 位置 + 1; 计数 <= 长度; ++计数)
新的[计数] = 对象->指针[计数 - 1];
如果(对象->指针) 删除[] 对象->指针; /* 可能为空 */
对象->指针 = 新的;
}
空类型 追加元素(常量 向量& 媒介) {
适应 长度 = 取容量();
适应 新的 = 新建 类型1[长度 +1] {空的};
计次循环(适应 计数 = 0; 计数 < 长度; ++计数)
新的[计数] = 对象->指针[计数];
新的[长度] = 媒介;
如果(对象->指针) 删除[] 指针; /* 可能为空 */
对象->指针 = 新的;
}
空类型 删除元素(常量 长度单位 位置) {
/* 越界检查 */
如果(位置 < 0 或 位置 >= 对象->容量)
抛出异常 下标越界{"向量元素插入", 对象->容量 + 1, 位置};
适应 长度 = 取容量();
适应 新的 = (长度 等于 1)
? 空指针 : 新建 类型1[长度 - 1] { 空的 };
/* 目标位置之前 */
计次循环(适应 计数 = 0; 计数 < 位置; ++计数)
新的[计数] = 对象->指针[计数];
/* 目标位置之后 */
计次循环(适应 计数 = 位置; 计数 < 长度; ++计数)
新的[计数] = 对象->指针[计数 + 1];
删除[] 对象->指针;
对象->指针 = 新的;
}
/*----------------*/
//类 迭代器{
//公开的:
// 迭代器(常量 std::vector<类型1>::iterator& it) {
// this->it = it;
// }
//私有的:
// std::vector<类型1>::iterator it;
//};
/*----------------*/
私有的:
类型1 *指针;
长度单位 容量;
};
}