通用索引容器模板类,为底层容器提供循环索引功能
更多...
#include <DAGenericIndexedContainer.hpp>
|
| enum class | IndexPolicy { AutoReset
, PreserveRaw
, ForceReset
} |
| | 容器替换时的索引调整策略 更多...
|
| |
|
using | value_type = typename Container::value_type |
| | 容器元素类型
|
| |
|
using | reference = typename Container::reference |
| | 元素引用类型
|
| |
|
using | const_reference = typename Container::const_reference |
| | 常量元素引用类型
|
| |
|
using | size_type = typename Container::size_type |
| | 容器大小类型
|
| |
|
|
using | iterator = typename Container::iterator |
| | 非常量迭代器类型
|
| |
|
using | const_iterator = typename Container::const_iterator |
| | 常量迭代器类型
|
| |
|
using | reverse_iterator = typename Container::reverse_iterator |
| | 反向迭代器类型
|
| |
|
using | const_reverse_iterator = typename Container::const_reverse_iterator |
| | 常量反向迭代器类型
|
| |
template<typename Container, typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
class DA::DAGenericIndexedContainer< Container, IndexType, SFINAE_CHECK >
通用索引容器模板类,为底层容器提供循环索引功能
- 模板参数
-
| Container | 底层容器类型,需满足以下接口:
size_type size() const 获取元素数量
reference operator[](size_type) 下标访问
const_reference operator[](size_type) const 常量下标访问
- 支持初始化列表构造
|
| IndexType | 索引值类型,用于跟踪容器位置,默认int类型 |
| SFINAE_CHECK | SFINAE约束检查,确保容器符合所需接口 |
本类通过组合方式包装任意标准容器,为其添加当前索引跟踪功能,支持循环遍历操作。 典型应用场景包括:循环缓冲区、轮播列表、状态机循环切换等。
特性
- 零成本抽象:所有操作均为O(1)时间复杂度
- 类型安全:编译期接口检查
- 循环语义:到达边界自动回绕
- 异常安全:不抛异常保证(nothrow)
示例1:使用std::vector
++words;
通用索引容器模板类,为底层容器提供循环索引功能
Definition DAGenericIndexedContainer.hpp:57
void moveToPrevious()
移动到上一个位置(循环)
Definition DAGenericIndexedContainer.hpp:242
示例2:使用Qt容器
reference current()
获取当前元素(非常量)
Definition DAGenericIndexedContainer.hpp:261
void emplace_back(Args &&... args)
向容器末尾原位构造元素
Definition DAGenericIndexedContainer.hpp:393
示例3:空容器处理
bool isValidIndex() const noexcept
检查当前索引是否有效
Definition DAGenericIndexedContainer.hpp:556
void moveToNext()
移动到下一个位置(循环)
Definition DAGenericIndexedContainer.hpp:212
◆ IndexPolicy
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
容器替换时的索引调整策略
该枚举定义了在替换底层容器时,如何处理当前索引的不同策略。 用于控制容器内容更新后索引的自动调整逻辑。
- 参见
- replace()
| 枚举值 |
|---|
| AutoReset | 自动智能重置策略(默认)
- 当新容器非空时:
- 若原索引在[0, 新容器size())范围内,保持原索引
- 若原索引超出范围,重置为0
- 当新容器为空时:
- 强制设置索引为0(此时isValidIndex()为false)
适用场景:大多数常规替换操作,在保持索引有效性的同时尽可能保留位置
|
| PreserveRaw | 原始索引保留策略
完全保留当前索引数值,无论是否有效。 调用者需自行检查索引有效性。
适用场景:需要精确控制索引位置的高级用法
- 警告
- 使用后必须检查isValidIndex()
if (!cont.isValidIndex()) {
cont.setCurrentIndex(0);
}
|
| ForceReset | 强制重置策略
无论原索引如何,强制设置索引为0。
- 新容器非空时:索引0有效
- 新容器为空时:索引0无效
适用场景:需要从容器起始位置开始操作的场景
assert(cont.currentIndex() == 0);
|
◆ DAGenericIndexedContainer() [1/3]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
默认构造空容器
- 注解
- 初始索引为0,但空容器isValidIndex()返回false
◆ DAGenericIndexedContainer() [2/3]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
template<typename... Args>
◆ DAGenericIndexedContainer() [3/3]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
初始化列表构造
- 参数
-
示例:
assert(chars.size() == 3);
◆ at() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
带边界检查的元素访问
- 参数
-
- 返回
- 对应元素的引用
- 异常
-
| std::out_of_range | 当 index 超出 [0, size()) 范围 |
示例:
try {
int val = cont.at(10);
} catch (const std::out_of_range& e) {
}
◆ at() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ begin() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ begin() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取指向容器首元素的迭代器
- 返回
- 起始迭代器
示例遍历所有元素:
for (auto it = cont.begin(); it != cont.end(); ++it) {
process(*it);
}
◆ clear()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ current() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取当前元素(非常量)
- 返回
- 当前索引处元素的引用
- 前置条件
- isValidIndex() == true
- 警告
- 无效索引调用导致未定义行为
示例:
auto& curr = container.current();
curr.setValue(42);
◆ current() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ currentIndex()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取当前索引值
- 返回
- 当前索引的数值
- 注解
- 返回值可能超出有效范围,需配合isValidIndex()使用
◆ emplace_back()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
template<typename... Args>
向容器末尾原位构造元素
- 模板参数
-
- 参数
-
- 注解
- 要求底层容器实现emplace_back()
示例:
container.emplace_back(1, "test");
◆ empty()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
检查容器是否为空
- 返回
- true 当且仅当size() == 0
- 注解
- 复杂度O(1)
◆ end() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ end() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ first() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取首元素(非常量版本)
- 返回
- 容器第一个元素的引用
- 警告
- 容器为空时调用将导致未定义行为
- 注解
- 等效于 operator[](0)
示例:
◆ first() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ firstChecked() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
安全获取首元素(带边界检查)
- 返回
- 容器第一个元素的引用
- 异常
-
| std::out_of_range | 当容器为空时抛出 |
示例安全访问:
try {
auto& val = cont.firstChecked();
} catch (const std::out_of_range&) {
}
◆ firstChecked() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ isFirstIndex()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
检查是否是第一个索引
- 返回
- 如果是第一个索引或容器为空返回true
◆ isLastIndex()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
检查是否是最后一个索引
- 返回
- 如果是最后一个有效索引或容器为空返回true
◆ isValidIndex()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
检查当前索引是否有效
- 返回
- true 当 0 <= index < size()
示例:
while (container.isValidIndex()) {
process(container.current());
++container;
}
◆ last() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取尾元素(非常量版本)
- 返回
- 容器最后一个元素的引用
- 警告
- 容器为空时调用将导致未定义行为
- 注解
- 等效于 operator[](size()-1)
示例:
◆ last() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ lastChecked() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
安全获取尾元素(带边界检查)
- 返回
- 容器最后一个元素的引用
- 异常
-
| std::out_of_range | 当容器为空时抛出 |
◆ lastChecked() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ moveToNext()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
移动到下一个位置(循环)
- 注解
- 空容器调用无效果
- 后置条件
- 索引值可能回绕到0
示例:
arr.moveToNext();
void setCurrentIndex(IndexType index) noexcept
设置当前索引
Definition DAGenericIndexedContainer.hpp:539
◆ moveToPrevious()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
移动到上一个位置(循环)
- 注解
- 空容器调用无效果
- 后置条件
- 索引值可能回绕到size()-1
示例:
assert(vec.current() == "Second");
◆ next()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
移动后获取下一个元素
- 返回
- 新位置的元素
- 警告
- 容器为空时行为未定义
◆ operator++() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
前缀递增(++obj)
- 返回
- 递增后的容器引用
- 后置条件
- 索引前进一位(可能回绕)
示例:
◆ operator++() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
后缀递增(obj++)
- 返回
- 递增前的元素副本
- 后置条件
- 索引前进一位(可能回绕)
示例:
auto old = container++;
process(old);
◆ operator--() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
前缀递减(–obj)
- 返回
- 递减后的容器引用
- 后置条件
- 索引后退一位(可能回绕)
示例:
◆ operator--() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
后缀递减(obj–)
- 返回
- 递减前的元素副本
- 后置条件
- 索引后退一位(可能回绕)
示例:
auto old = container--;
process(old);
◆ operator=() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
拷贝赋值底层容器
- 参数
-
- 返回
- 当前对象的引用
- 注解
- 赋值后会尝试保持当前索引有效性:
- 如果原索引在新容器范围内则保留
- 否则重置为0(若新容器非空)或保持0(空容器)
- 警告
- 若新容器为空,索引将标记为无效
示例1:缩小容器大小
std::vector<int> newData{5,6};
cont = newData;
示例2:扩大容器大小
cont.setCurrentIndex(1);
cont = std::vector<int>{1,2,3,4,5};
◆ operator=() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
移动赋值底层容器
- 参数
-
- 返回
- 当前对象的引用
- 注解
- 行为与拷贝赋值一致,但更高效
- 警告
- 移动后源容器other状态未定义
示例:
std::vector<int> data{1,2,3};
cont = std::move(data);
◆ operator[]() [1/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
下标访问操作符(非const版本)
- 参数
-
- 返回
- 对应元素的引用
- 警告
- 不进行边界检查,调用者需确保 0 <= index < size()
- 注解
- 与当前索引无关,仅访问指定位置元素
示例:
cont[1] = 5;
assert(cont[1] == 5);
- 警告
- 以下情况导致未定义行为:
- index < 0
- index >= size()
- 容器为空时访问任意索引
◆ operator[]() [2/2]
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
◆ previous()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
移动后获取上一个元素
- 返回
- 新位置的元素
- 警告
- 容器为空时行为未定义
◆ rbegin()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
获取反向起始迭代器
示例反向遍历:
for (auto rit = cont.rbegin(); rit != cont.rend(); ++rit) {
process(*rit);
}
◆ replace()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
替换容器内容并智能调整索引
- 参数
-
| newContainer | 新容器 |
| policy | 索引调整策略(默认为AutoReset) |
策略选项:
- AutoReset: 自动重置到0或保持有效索引(默认)
- PreserveRaw: 保留原始索引值(可能无效)
- ForceReset: 强制重置到0
示例:强制重置索引
◆ setCurrentIndex()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
设置当前索引
- 参数
-
- 注解
- 不进行范围检查,设置后应调用isValidIndex()验证
示例:
container.setCurrentIndex(5);
if (container.isValidIndex()) {
}
◆ size()
template<typename Container , typename IndexType = int, typename SFINAE_CHECK = std::void_t< typename Container::size_type, typename Container::value_type, decltype(std::declval< Container >()[ std::declval< typename Container::size_type >() ]) >>
该类的文档由以下文件生成: