我有一个包含许多对象的顶点类,例如
class Vertex{
int i;
public:
Vertex(const int & a):i(a){}
};
Vertex v1(1),v2(2)...v100(100);
现在我要制作50对,每对连接两个顶点。实现这一目标的最佳方法是什么?我绝对不想做以下事情:
std::pair<const Vertex &, const Vertex &> p1(v1,v2);
...
std::pair<const Vertex &, const Vertex &> p50(v99,v100);
std :: make_pair似乎是一个更好的选择。但如果我理解正确,它只接受价值而不是参考。非常感谢。
答案 0 :(得分:3)
std::make_pair
可用于通过std::ref
创建引用对。 std::ref
在std::reference_wrapper
中存储引用,该引用通过模板类型扣除减少回引用。对于const
引用,请使用std::cref
。
正如其他答案所示,我建议您将Vertex
es存储在std::vector
中,并在for循环中初始化它们。同样,将std::pair
个Vertex
个引用存储在一个向量中,并在循环中构建它们。
constexpr auto num_vertices = 100;
std::vector<Vertex> v;
v.reserve(num_vertices);
for (auto i = 0; i < num_vertices; ++i)
v.emplace_back(i);
std::vector<std::pair<const Vertex&, const Vertex&>> p;
p.reserve(num_vertices/2);
for (auto i = 0; i < num_vertices; i += 2)
p.emplace_back(v[i], v[i+1]);
请注意emplace_back
用于构建Vertex
es和std::pair
就地。
但是,如果您绑定了50行对初始化,并且想要使用std::make_pair
提供的类型推导,请使用:
auto p1 = std::make_pair(std::cref(v1), std::cref(v2)),
p2 = std::make_pair(std::cref(v3), std::cref(v4)),
// ...
p50 = std::make_pair(std::cref(v99), std::cref(v100));
但在这种情况下,使用统一初始化更简单:
std::pair<const Vertex&, const Vertex&> p1 = {v1, v2},
p2 = {v2, v3},
// ...
p50 = {v99, v100};
以下是ideone.com的实例。
答案 1 :(得分:1)
为什么不使用std::vector
来存储Vertex
对的对象?
std::vector<std::pair<Vertex, Vertex>> v;
v.reserve(50); // Reserve memory to avoid unnecessary allocations.
for (int i = 1; i < 100; i += 2) {
v.emplace_back(i, i + 1); // Create 50 pairs in vector.
}
稍后访问各个顶点,如:
auto& p1 = v[0];
/* ... */
auto& p50 = v[49];
如果你真的想为所有顶点保留100个变量,那么你可以使用std::reference_wrapper
在Vertex
中存储对std::pair
的常量引用:
auto p1 = std::make_pair(std::cref(v1), std::cref(v2));