C++容器上的泛型操作
Generic operations on C++ containers
如何在C++STL容器上编写泛型操作?例如,Java有Collection接口,每个Java容器(除了映射)都实现该接口。无论实际容器是LinkedList、HashSet、ArrayBlockingQueue等,我都可以执行添加、删除、包含和迭代等操作。我觉得它非常强大。C++有迭代器,但是像add和remove这样的操作呢?向量有pushback,集合有insert,队列有push。如何以通用的方式向C++容器添加一些内容?
迭代:
所有标准容器都有iterators
,它提供对容器元素的有序访问。这些也可以用于通用算法,这些算法适用于任何一致的迭代器类型。
插入:
所有序列和关联容器都可以通过表达式c.insert(i, x)
将元素插入其中——其中c
是序列或关联容器,i
是c
的迭代器,x
是要添加到c
的值。
CCD_ 8和友元可以用于以通用方式向序列或关联容器添加元素。
删除:
对于任何序列或关联容器,以下代码有效:
while (true) {
X::iterator it(std::find(c.begin(), c.end(), elem));
if (it == c.end()) break;
c.erase(it);
}
其中,X
是容器的类型,c
是容器对象,elem
是具有要从容器中删除的值的对象。
对于序列,有一个擦除-删除习惯用法,看起来像:
c.erase(std::remove(c.begin(), c.end(), elem), c.end());
对于关联容器,您也可以执行以下操作:
c.erase(k);
其中k
是与要擦除的元素相对应的密钥。
这是一个很好的界面:
参见助推范围
注意--这些是编译时可替换的,而java是运行时可替换。为了允许运行时替换,有必要使用类型擦除(也就是说,制作一个模板化的子类,将所需的接口转发到实例化它的容器)。
查看标题<algorithm>
。有很多通用算法用于查找、排序、计数、复制等,这些算法适用于任何提供具有各种特定特性的迭代器的东西。
C++有std::inserter
和朋友可以以通用的方式将元素添加到容器中。它们位于头文件iterator
中。
- 错误处理.将系统错误代码映射到泛型
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 链表的泛型函数remove()与成员函数remove)
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何编写将要继承的泛型代码?
- C++17 如何保存泛型可调用对象以供以后使用
- 使用宏扩展的泛型:为什么指令缓存使用不当?
- C++泛型类错误,问题出在哪里?
- C++泛型类,单独实现?
- 将参数传递给泛型 lambda 时复制构造函数不正确
- 泛型枚举和其他类型的重载模板函数
- 使用泛型类型推送到堆栈时出现问题
- 可变参数泛型 lambda 和函数重载
- C++ 泛型和多态性:这种模式可行吗?
- 用于泛型类型上的泛型操作的SFINAE
- 对给定结构成员应用操作的泛型方法
- 具有不同成员变量的多个操作的泛型类
- 普通变量和常量变量的泛型操作
- C++容器上的泛型操作