假设我有一个包含 的容器int
,一个在包含 的容器上工作的函数Point
,并且我有一个函数,给定一些int
给我Point
它所代表的对应(想象我已经在我的场景中索引了一些大的所有点std::vector<Point>
)。如何创建一个简单(高效)的包装器来使用我的第一个容器而不复制其内容?
我想输入的代码是这样的:
template<typename InputIterator>
double compute_area(InputIterator first, InputIterator beyond) {
// Do stuff
}
template<typename InputIterator, typename OutputIterator>
void convex_hull(InputIterator first, InputIterator beyond, OutputIterator result) {
// Do stuff
}
struct Scene {
std::vector<Point> vertices;
foo(const std::vector<int> &polygon) {
// Create a simple wraper with limited amount of mumbo-jumbo
auto functor = [](int i) -> Point& { return vertices[polygon[i]]; });
MagicIterator polyBegin(0, functor);
MagicIterator polyEnd(polygon.size(), functor);
// NOTE: I want them to act as random access iterator
// And then use it directly
double a = compute_area(polyBegin, polyEnd);
// Bonus: create custom inserter similar to std::back_inserter
std::vector<int> result;
convex_hull(polyBegin, polyEnd, MagicInserter(result));
}
};
所以,正如你所看到的,我正在寻找一些通用的东西。我也考虑过使用 lambdas,但我对如何继续保持简单和用户友好有点困惑。