美文网首页
2.3 无序向量

2.3 无序向量

作者: 月影追猎者 | 来源:发表于2020-06-22 10:17 被阅读0次

元素访问(循秩访问)
通过V.get(r)与V.put(r, e)接口已然可以读写向量元素,但就便捷性而言,远不如数组元素的访问方式A[r],需要重载下标操作符"[]"

template <typename T> // 0 <= r < _size
T & Vector<T>::operator[](Rank r) const {return _elem[r];}

对外V[r]即对应于内部V._elem[r]

插入

template <typename T> // e作为秩为r元素插入,0 <= r <= _size
Rank Vector<T>::insert(Rank r, T const & e) {
    expand(); // 若有必要,扩容
    for (int i = _size; i > r; i--) // 自后向前
        _elem[i] = _elem[i - 1]; // 后继元素顺次后移一个单元
    _elem[r] = e; // 置入新元素
    _size++; // 更新规模
    return r; // 返回秩
}

区间删除

template <typename T> // 删除区间[lo, hi),0 <= lo <= hi <= _size
int Vector<T>::remove(Rank lo, Rank hi) {
    if (lo == hi) return 0; // 出于效率考虑,单独处理退化情况
    while (hi < _size) _elem[lo++] = _elem[hi++]; // [hi, _size)顺次前移hi - lo位
    _size = lo; // 更新规模
    shrink(); // 若有必要,缩容
    return hi - lo; // 返回被删除元素数目
}

查找
无序向量:T为可判等的基本类型,或已重载操作符"=="或"!="
有序向量:T为可比较的基本类型,或已重载操作符"<"或">"

template <typename T> // 0 <= lo < hi <= _size
Rank Vector<T>::find(T const & e, Rank lo, Rank hi) const {
    while ((lo < hi--) && (e != _elem[hi])); // 逆向查找,在命中多个元素时可返回秩最大者
    return hi; // hi < lo为失败,否则hi即命中元素的秩
}

单元素删除

// 可视作区间删除操作[r] = [r, r + 1)
template <typename T> // 删除向量中秩为r的元素,0 <= r < _size
T Vector<T>::remove(Rank r) {
    T e = _elem[r];  // 备份被删除元素
    remove(r, r + 1); // 调用区间删除算法
    return e; // 返回被删除元素
}

唯一化

template <typename T> // 删除重复元素,返回被删除元素数目
int Vector<T>::deduplicate() { // 低效算法
    int oldSize = _size; // 记录原规模
    Rank i = 1; // 自_elem[1]开始
    while (i < _size) // 自前向后逐一考查元素_elem[i]
        (find(_elem[i], 0, j) < 0) ? i++ : remove(i); // 在前缀中查找重复者,若无则继续考查,否则删除重复者
    return oldSize - _size; // 向量规模变化量,即删除元素数目
}

遍历

// 利用函数指针机制,只读或局部性修改
template <typename T>
void Vector<T>::traverse(void (*visit)(T&)) {
    for (int i = 0; i < _size; i++)
        visit(_elem[i]);
}
// 利用函数对象机制,可全局性修改
template <typename T> template <typename VST>
void Vector<T>::traverse(VST& visit) {
    for (int i = 0; i < _size; i++)
        visit(_elem[i]);
}

相关文章

网友评论

      本文标题:2.3 无序向量

      本文链接:https://www.haomeiwen.com/subject/sicoxktx.html