C++ 容器上的通用操作

Posted

技术标签:

【中文标题】C++ 容器上的通用操作【英文标题】:Generic operations on C++ containers 【发布时间】:2011-06-07 01:06:44 【问题描述】:

如何在 C++ STL 容器上编写通用操作?例如,Java 有Collection 接口,每个Java 容器(地图除外)都实现了该接口。无论实际容器是 LinkedList、HashSet、ArrayBlockingQueue 等,我都可以进行添加、删除、包含和迭代等操作。我觉得它非常强大。 C++ 有迭代器,但是像 add 和 remove 这样的操作呢? vector 有 push_back,set 有 insert,queue 有 push。如何以通用方式向 C++ 容器中添加内容?

【问题讨论】:

查看 C++ 标准的第 25 节,它包含 28 页各种算法,适用于各种容器。 【参考方案1】:

迭代:

所有标准容器都有iterators,可以按顺序访问容器的元素。这些也可以用于适用于任何符合迭代器类型的通用算法。

插入:

所有序列和关联容器都可以通过表达式c.insert(i, x) 插入元素——其中c 是序列或关联容器,ic 的迭代器,x 是一个值你想添加到c

std::inserter 和朋友可用于以通用方式将元素添加到序列或关联容器。

删除:

对于任何序列或关联容器,以下代码都有效:

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 是与您要擦除的元素相对应的键。

一个很好的界面:

见Boost.Range。

注意 -- 这些是编译时可替换的,而 java 是运行时可替换的。为了允许运行时替换,必须使用类型擦除(即——创建一个模板化的子类,将所需的接口转发到实例化它的容器)。

【讨论】:

erase-remove 仅适用于 sequences,并非所有标准容器。 但是你写的“或关联容器”正是我想的那些你不能使用擦除删除的容器。【参考方案2】:

查看标题<algorithm>。那里有大量用于查找、排序、计数、复制等的通用算法,它们适用于任何提供具有各种指定特征的迭代器。

【讨论】:

【参考方案3】:

C++ 有std::inserter 和朋友以通用方式向容器添加元素。它们在头文件iterator中。

【讨论】:

以上是关于C++ 容器上的通用操作的主要内容,如果未能解决你的问题,请参考以下文章

捋一捋操作python容器的内置通用函数

C++在类中定义vector并初始大小的问题

C++ STL list详解

Python通用序列操作

C++ vector容器删除操作

C++迭代器的使用和操作总结