所有的算法处理都是半开半闭区间,包括起始位置但不包括结束位置,传统的数据标识方式是:
[begin,end)
半开半闭区间主要是单纯,可以免除对空集做出的特殊处理,当然这种使用方式肯定也有他的弊端,我们来看看下面的例子
void tsm_algorithm2(){
list<int> tsm_list;
for (int i = 20; i < 40; ++i) {
tsm_list.push_back(i);
}
// 查找5 ,由于没有是找不到的,找不到的情况下返回的是 end,
auto res = find(tsm_list.cbegin(),tsm_list.cend(),5);
//由于返回的res 就是end,所以这里翻转的就是 [end,end),没有操作
reverse(res,tsm_list.cend());
}
这里例子比较简单,如果在没有查到情况下,返回的结果就是 end ,那么使用 [end,end) 翻转是没有任何效果的,
继续延伸上面这个例子
void tsm_algorithm2(){
list<int> tsm_list;
for (int i = 20; i < 40; ++i) {
tsm_list.push_back(i);
}
// 查找5 ,由于没有是找不到的,找不到的情况下返回的是 end,
auto res = find(tsm_list.cbegin(),tsm_list.cend(),5);
//由于返回的res 就是end,所以这里翻转的就是 [end,end),没有操作
reverse(res,tsm_list.cend());
auto pos25=find(tsm_list.cbegin(),tsm_list.cend(),25);
auto pos35=find(tsm_list.cbegin(),tsm_list.cend(),35);
}
如果我们在不知道内部的排列顺序的情况下,并且25 和35 在不在容器内可能都有疑问,那么我们如何来获取 25-35 这个区间内的数据呢
这里有2种情况,
1: 单向 or 双向 迭代器,不可以使用 iterator 的 operator > 和 operator < 比较指针大小,我们可以使用如下方法
// 1: 其他迭代器 单向 or 双向迭代器
//先判断都存在,
if(pos25!=tsm_list.end()&&pos35!=tsm_list.end()){
// 再次查找一次,如果在 [25,end) 能找到35,那么证明 35是在 25的右边
auto res_35= find(pos25,tsm_list.cend(),35);
if(res_35!=tsm_list.end()){// 35 > 25
// [25,35)
}else{
//[35,25)
}
}
2: 随机访问迭代器
// 2: 随机访问迭代器 可以比较指针的大小,直接判断就好了
//先判断都存在,
if(pos25!=tsm_list.end()&&pos35!=tsm_list.end()){
if(pos25 < pos35){
//[25,35)区间
}else{
//[35,25) 区间
}
}
注意这里访问的区间都是[25,35)这种半开半闭区间,如果我们要访问到 35这个数据该如何处理呢,非常简单
在end 处传入 ++ pos_35 即可