C++标准库学习之 STL 迭代器 Rang 区间

73 阅读2分钟

所有的算法处理都是半开半闭区间,包括起始位置但不包括结束位置,传统的数据标识方式是:

[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 即可