gpt4 book ai didi

c++ - 基于范围的 for 循环和多个迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:10:14 27 4
gpt4 key购买 nike

我有以下代码,表示 3D 应用程序中的网格(为清楚起见省略了一些代码):

class Mesh {
public:
typedef std::vector<Vertex> Vertices;
typedef std::vector<int> Elements;

template<class VerticesIt, class ElementsIt>
Mesh(const VerticesIt verticesBegin,
const VerticesIt verticesEnd,
const ElementsIt elementsBegin,
const ElementsIt elementsEnd) :
vertices_(verticesBegin, verticesEnd),
elements_(elementsBegin, elementsEnd) {
}
virtual ~Mesh();

typename Vertices::const_iterator verticesBegin() const {
return vertices_.begin();
};

typename Vertices::const_iterator verticesEnd() const {
return vertices_.end();
};

typename Elements::const_iterator elementsBegin() const {
return elements_.begin();
};

typename Elements::const_iterator elementsEnd() const {
return elements_.end();
};

private:
Vertices vertices_;
Elements elements_;

};

它工作得很好,为内部数据提供了清晰的界面。没有公开容器的实现细节。

尽管如此,我还是有点小问题。我不能使用基于范围的 for 循环,必须使用迭代器:

for (auto it = mesh.verticesBegin(); it != mesh.verticesEnd(); ++it) {
// Do stuff
}

for (auto it = mesh.elementsBegin(); it != mesh.elementsEnd(); ++it) {
// Do stuff
}

对我来说有点冗长。我首选的客户端代码应该是这样的:

for(auto & vert : mesh.vertices) {
// Do stuff.
}

for(auto & element : mesh.elements) {
// Do stuff.
}

是否有可能在暴露容器的实现细节的情况下实现这一点?此外,我不想将容器包装到自定义类中,因为我想完全访问 Mesh 类中的所选容器 (std::vector)。

最佳答案

您可以使用某种代理,例如:

template<typename Container>
class ConstIteratorProxy
{
public:
ConstIteratorProxy(const Container& container) : container_(container) { }
typename Container::const_iterator begin() const {
return container_.begin();
};
typename Container::const_iterator end() const {
return container_.end();
};
private:
const Container& container_;
};

在网格中:

ConstIteratorProxy<Vertices> vertices() const {
return ConstIteratorProxy<Vertices>(vertices_);
}
ConstIteratorProxy<Elements> elements() const {
return ConstIteratorProxy<Elements>(elements_);
}

然后使用它:

Mesh m;
for (auto& v : m.vertices()) { }
for (auto& e : m.elements()) { }

关于c++ - 基于范围的 for 循环和多个迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com