2014-02-28 91 views
1

我有一個包含很多對象的頂點類,例如在C++中實例化對象

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

創建一個類型爲Vertex的向量並遍歷它們,將每個後續的兩個元素進行配對? – AndyG

+0

它究竟如何工作?假設我有矢量 v;這樣做:for(i = 0; i <= 99; i ++)std :: pair = p(v [i],v [i + 1])?恐怕這是行不通的,因爲它使用了相同的「p」。對不起,我對C++只是一個新手。 – Void

+3

你有100個變量? –

回答

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上的一個實例。

+0

這裏有沒有優於常規指針的'std :: reference_wrapper'? – Potatoswatter

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]; 

如果你真的想使用std::reference_wrapper保持100個變量的所有頂點,那麼你可以存儲在std::pairVertex經常提到:

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