C++11 C++中实例化的对对象

C++11 C++中实例化的对对象,c++11,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

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

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

为什么不使用std::vector来存储顶点对

如果确实要为所有顶点保留100个变量,则可以使用以下命令在std::pair中存储对顶点的常量引用:

为什么不使用std::vector来存储顶点对呢

如果确实要为所有顶点保留100个变量,则可以使用以下命令在std::pair中存储对顶点的常量引用:

std::make_pair可用于通过使用std::ref创建引用对。std::ref将引用存储在std::reference_包装中,通过模板类型推断,该包装将引用还原为引用。对于常量引用,请使用std::cref

正如其他答案所建议的,我建议将顶点存储在std::vector中,并在for循环中初始化它们。类似地,将std::对顶点引用存储在向量中,并在循环中构造它们

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]);
但在这种情况下,只使用统一初始化更简单:

std::pair<const Vertex&, const Vertex&> p1 = {v1, v2},
                                        p2 = {v2, v3},
                                        // ...
                                        p50 = {v99, v100};
下面是一个关于的实时示例。

std::make\u pair可用于通过使用std::ref创建引用对。std::ref将引用存储在std::reference\u包装中,通过模板类型推断,该包装可还原为引用。对于常量引用,请使用std::cref

正如其他答案所建议的,我建议将顶点存储在std::vector中,并在for循环中初始化它们。类似地,将std::对顶点引用存储在向量中,并在循环中构造它们

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]);
但在这种情况下,只使用统一初始化更简单:

std::pair<const Vertex&, const Vertex&> p1 = {v1, v2},
                                        p2 = {v2, v3},
                                        // ...
                                        p50 = {v99, v100};

下面是一个关于的实例。

创建一个Vertex类型的向量并在其上迭代,每两个向量配对一次?它到底是如何工作的?假设我有向量v;我是否这样做:fori=0;你有100个变量???假设我有。有没有办法避免一些繁重的工作?关于引用对的一些技巧:创建一个顶点类型的向量并在它们上面迭代,每两个顶点配对一次?它到底是如何工作的?假设我有向量v;我是否这样做:fori=0;你有100个变量???假设我有。有什么方法可以避免一些繁重的工作吗?关于引用对的一些提示:std::reference\u wrapper比常规指针有什么优势吗?std::reference\u wrapper比常规指针有什么优势吗?
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};