将向量迭代器传递到模板函数中

Passing vector iterators into a template function

本文关键字:函数 向量 迭代器      更新时间:2023-10-16

在将迭代器传递到函数中时,我认为使用向量更容易,所以我使用构造函数进行转换,但看起来像是创建了新的向量。因此,函数没有返回任何更改。但我需要它是可变的,而不是新的记忆。

template <class Element>
void HeapSort::MaxHeapify(typename vector<Element>::iterator first, typename vector<Element>::iterator last, ...)
{
    vector<Element> array(first, last);
    ...
}

此外,当调用这样一个函数时,我必须明确指出Element的类型。为什么?

MaxHeapify<Element>(array.begin(), array.end(), i);

编辑:我的意思是*(first + i) = 5不像array[i] = 5那样容易写和读。

第2版:看起来它可以写成first[i] = 5。也许有人能帮我解决问题的第二部分吗?

不需要在函数中构造新的向量。您可以只使用迭代器来执行算法。但是,如果你想这样做,因为它"更容易",你必须在处理完向量后将结果数组中的值复制到参数范围。你的方法无法避免分配新内存。

至于第二个问题,编译器无法推导出Element类型。你可以通过如下声明模板来解决这个问题:

template <class Iter>
void HeapSort::MaxHeapify(Iter first, Iter last, ...)

作为奖励,这允许函数与任何类型的随机访问迭代器一起工作。