在C ++中实例化对象对象

时间:2014-02-28 00:16:40

标签: c++11

我有一个包含许多对象的顶点类,例如

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似乎是一个更好的选择。但如果我理解正确,它只接受价值而不是参考。非常感谢。

2 个答案:

答案 0 :(得分:3)

std::make_pair可用于通过std::ref创建引用对。 std::refstd::reference_wrapper中存储引用,该引用通过模板类型扣除减少回引用。对于const引用,请使用std::cref

正如其他答案所示,我建议您将Vertex es存储在std::vector中,并在for循环中初始化它们。同样,将std::pairVertex个引用存储在一个向量中,并在循环中构建它们。

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_wrapperVertex中存储对std::pair的常量引用:

auto p1 = std::make_pair(std::cref(v1), std::cref(v2));