4

我猜这是一个简单的问题。

向量和列表都具有推送和弹出功能,而且——更重要的是——可以迭代:

for ( auto value : items )
    ...

但是,std::vector 和 std::list 似乎并不共享一个基类。因此,问题是:我如何编写一个函数来接受其中一个(或者,实际上,任何其他适合实现的)?

std::list<int> a;
std::vector<int> b;
DoSomething(a);
DoSomething(b);

我想在不超载的情况下做到这一点。如果使用模板,它们不应该导致疯狂的错误消息。例如下面的代码——

int a;
DoSomething(a);

-- 应该会导致调用站点出现编译错误,而不是模板内部的某个地方!

有人有想法么?

4

2 回答 2

1

C++ 标准化委员会试图将概念引入 C++0x(现在的 C++11)以解决您在此处提出的问题。他们被迫在文章后期退出,所以我们必须等到标准的未来版本。

Boost 的BCCL提供了一种便携式临时解决方案。我从来没有使用过图书馆,所以我不能保证或反对它。

于 2013-06-28T00:47:12.400 回答
1

大多数 stl 算法使用迭代器作为容器的抽象层。

例如,sort需要 2 个随机访问迭代器来排序:

template <class RandomAccessIterator>
   void sort (RandomAccessIterator first, RandomAccessIterator last);

大部分算法都可以用这个习语来实现

根据您计划实现的算法,您需要在 4 种标准迭代器中进行选择

是一个链接,它解释了哪种类型更适合

于 2013-06-28T01:02:14.603 回答