如何将未知数量的元素输出到标准容器

时间:2015-12-08 13:01:19

标签: c++ c++11 iterator

我有以下功能:

template <class Titerator>
void detect_corners(cv::Mat const& frame, Titerator begin_corners);

应该在begin_corners中输出4个角和4个角。所以,一切都很好,很容易。但是,要求发生了变化,现在可能会返回任意数量的角落。在不失一般化的情况下处理这个问题的最佳方法是什么?我的意思是我不想总是使用vector而不是一般的迭代器。

P.S。调用此功能时,我不知道会得到多少个角落。该函数应该运行然后它知道。

2 个答案:

答案 0 :(得分:2)

只需使用OutputIterator即可。无需更改声明,但我给出了说明迭代器作为OutputIterator的要求的名称。

File.expand_path

您可以为任何标准容器获取输出迭代器。例如,vector的后插入器:

template <class IterOut>
void detect_corners(cv::Mat const& frame, IterOut out) {
    while(condition) {
        *out++ = whatever;
    }
}

答案 1 :(得分:1)

C ++有一个OutputIterator概念,它允许您传入一个可用于写入的迭代器。您可以在函数中接受此操作的示例:

template <typename OutputIterator>
void detect_corners(const cv::Mat &frame, OutputIterator it) {
    for (/* each corner */) {
        it = corner; // Assigning to an OutputIterator
                     // appends an element to the container.
    }
}

然后,您需要创建一个OutputIterator兼容的迭代器来传递给您的函数 - 为vector执行此操作:

detect_corners(frame, std::back_inserter(my_vector));

您还可以为不同的容器创建OutputIterator,有关详细信息,请参阅OutputIterator concept documentation