2012-11-15 32 views
15

Tôi muốn điền vào một vectơ có 8 cặp. Mỗi cặp đại diện cho di chuyển trong x và y phối hợp một hiệp sĩ trong một trò chơi cờ vua có thể thực hiện. Tại thời điểm này tôi đang thực hiện như thế nàyĐiền một vectơ của các cặp

vector<pair<int,int>> moves[8]; 

pair<int,int> aPair; 
aPair.first = -2; 
aPair.second = -1; 
moves[0].push_back(aPair); 
aPair.first = -2; 
aPair.second = 1; 
moves[1].push_back(aPair); 
aPair.first = -1; 
aPair.second = -2; 
moves[2].push_back(aPair); 
aPair.first = -1; 
aPair.second = 2; 
moves[3].push_back(aPair); 
aPair.first = 1; 
aPair.second = -2; 
moves[4].push_back(aPair); 
aPair.first = 1; 
aPair.second = 2; 
moves[5].push_back(aPair); 
aPair.first = 2; 
aPair.second = -1; 
moves[6].push_back(aPair); 
aPair.first = 2; 
aPair.second = 1; 
moves[7].push_back(aPair); 

Tôi đang làm điều này để tìm hiểu về thư viện Std. Điều này có vẻ như một cách vô hiệu quả để giải quyết vấn đề này.

Bất kỳ ai có giải pháp thanh lịch hơn?

+4

quan sát đầu tiên: sử dụng 'di chuyển [0] .push_back (std :: make_pair (-2 , -1)); ' quan sát thứ hai: Bạn có 8 vectơ không phải một. – andre

Trả lời

13

Loops để giải cứu:

for(int k = 0; k < 2; k++) 
    for(int i = -1; i < 2; i += 2) 
     for(int j = -1; j < 2; j+= 2) 
      result.push_back(make_pair(i * (k+1), j * (((k + 1) % 2) + 1))); 

Output: http://ideone.com/2B0F9b

+0

Wow đó là một giải pháp thực sự tốt đẹp. Cảm ơn! –

15

Nếu bạn có C++ 11 (nếu không bạn không thể viết >>), bạn có thể sử dụng như sau:

vector<pair<int,int>> moves = { 
    {-2, -1}, 
    {-2, 1}, 
    {-1, -2}, 
    {-1, 2}, 
    { 1, -2}, 
    { 1, 2}, 
    { 2, -1}, 
    { 2, 1} 
}; 
+0

Bạn cần thêm một cặp dấu ngoặc ôm xung quanh mỗi cặp số, cặp bên trong thực hiện khởi tạo tổng hợp của cặp 'std ::' và cặp ngoài được yêu cầu cho hàm tạo' vector'. – Praetorian

+0

@Praetorian: 'std :: pair <>' không phải là tổng hợp, đó là lời gọi hàm tạo. – ildjarn

+0

@ildjarn Hmm, luôn luôn giả định là như vậy. Nhưng gcc 4.7.0 đang phàn nàn nếu bạn bỏ qua các dấu ngoặc bổ sung. – Praetorian

6

Nếu bạn không có C++ 11 bạn có thể sử dụng make_pair, trước - Phân bổ không gian cho vectơ mà không khởi tạo các phần tử sử dụng dự trữ, và sau đó sử dụng push_back mà không có phân bổ mới đang được thực hiện.

Ví dụ:

vector<pair<int,int> > moves; 
moves.reserve(8); 
moves.push_back(make_pair(-2, -1)); 
    // and so on 

Thậm chí nếu bạn có C++ 11 kỹ thuật này rất hữu ích nếu bạn cần phải tính toán các yếu tố một cách nhanh chóng hơn là cứng mã chúng.

+0

Cảm ơn bạn vì điều này. Tôi đã đánh dấu một câu trả lời, nhưng tôi nghĩ rằng nó nên đã đi cô ấy. –

+0

Bạn được chào đón! –

3

Hãy thử rằng:

vector<pair<int,int>> moves{{-2, -1}, {2, 1}, {-1, -2}, {-1, 2}, 
          {1, -2}, {1, 2}, {2, -1}, {2, 1}}; 

Initializer list cùng với Khởi Uniform cho rất nhiều năng lượng trong C++ 11.

9

Trong C++ 98/03:

moves.push_back(std::make_pair(-2, -1)); 

Trong C++ 11:

moves.emplace_back(-2, -1); 

Ngoài ra trong C++ 11:

std::vector<std::pair<int, int>> moves = { { -2, -1}, ... }; 
1

Đây là một phương pháp làm điều tương tự.

template <class VectorClass> 
class CreateVector 
{ 
public: 
    typedef typename VectorClass::value_type value_type; 
    CreateVector(const value_type& value) 
    { 
     mVector.push_back(value); 
    } 

    CreateVector& operator()(const value_type& value) 
    { 
     mVector.push_back(value); 
     return *this; 
    } 

    inline operator VectorClass() const 
    { 
     return mVector; 
    } 
private: 
    VectorClass mVector; 
}; 

Cách sử dụng:

vector<pair<int,int>> moves = CreateVector<vector<pair<int,int> > > 
(make_pair(1,2)) 
(make_pair(2,3)) 
(make_pair(3,4)) 
(make_pair(4,5)); 

EDIT: Miễn là bạn đang không sử dụng C++ 11, đây sẽ là một cách. Nếu không, tôi sẽ đề nghị để đi theo cách @ipc đề nghị.

0

Nếu bạn đang sử dụng C++ 11, bạn có thể muốn xem xét std :: mảng thay vì std :: vector. Giống như một mảng bình thường, mảng std có một số nguyên tố cố định và có ý nghĩa khái niệm hơn nếu bạn biết trước số lượng dữ liệu bạn sử dụng.

0

Hy vọng rằng một phiên bản dễ đọc hơn với vòng:

vector<pair<int, int>> result; 
for(int moveX=1; moveX<=2; moveX++) 
{ 
    for(int signX=-1; signX<=1; signX+=2) 
    { 
     for(int signY=-1; signY<=1; signY+=2) 
     { 
      result.push_back(make_pair(moveX*signX, (3-moveX)*signY)); 
     } 
    } 
} 

Full program tạo ra vectơ sau:

{-1, -2}, 
{-1, 2}, 
{1, -2}, 
{1, 2}, 
{-2, -1}, 
{-2, 1}, 
{2, -1}, 
{2, 1}, 
Các vấn đề liên quan