2015-01-05 52 views
2

我想正确学习C++。我开始考虑的一个问题是如何正确地使模板功能成为正确类型的容器。一个例子是实现合并排序。为了避免在为递归步骤将对象分割成两半时需要创建一个容器的副本,我想使用迭代器。这意味着,我需要有以下形式的合并功能:返回正确的容器类型

template<typename ForwIt, typename Comparator> 
... merge(ForwIt begina, ForwIt enda, ForwIt beginb, ForwIt endb, Comparator comp) 
{ 
    Container foo; 
    ... 
    return foo; 
} 

我的问题:

  1. 如何定义,在一个习惯的方法正确的返回类型的功能?

  2. 我应该如何替换“容器”类型,以便它是与要合并的组件相同的容器的实例? (我这里假设两个参数合并是迭代器相同类型的容器)

一般情况下,如何使代码清洁和高效的可能吗?

+1

@ JT1:请注意,几乎没有任何算法与容器有任何关系。我应该能够通过20元素矢量的第10个元素排序第5个元素,没问题。 –

回答

4

看标准std::merge

template< class InputIt1, class InputIt2, class OutputIt > 
OutputIt merge(InputIt1 first1, InputIt1 last1, 
       InputIt2 first2, InputIt2 last2, 
       OutputIt d_first); 

标准的方式做,这是通过一个(输出)迭代器,你的函数将写入结果。在std::merge的情况下,它还将迭代器返回到复制的最后一个元素之后的元素

容器的标准算法将迭代器作为参数,当它们返回某些内容时,它们将返回迭代器。他们从来都不是“容器意识”。

+0

啊,就是这样。我无法弄清楚如何在不考虑其大小的前提下使用迭代器进行存储。看起来像std :: back_inserter是使这种方法工作的谜题的缺失部分。 – JT1