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

How to output Unknown number of element to standard container

本文关键字:输出 标准 元素 未知数      更新时间:2023-10-16

我有以下功能:

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

它应该向begin_corners输出4个角点和仅4个角。所以,一切都很顺利。然而,要求发生了变化,现在可以返回任意数量的角。在不失概括的情况下,处理这一问题的最佳方法是什么?。我的意思是,我不想总是使用向量而不是通用迭代器。

附言:当调用这个函数时,我不知道会得到多少个角。函数应该运行,然后它就知道了。

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

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

您可以获得任何标准容器的输出迭代器。例如,向量的后插入器:

std::vector<T> v;
detect_corners(frame, std::back_inserter(v));

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概念文档。