2013-08-28 72 views
9

Trong C++, nếu tôi có hai vectơ của int:Chuyển đổi hai vectơ của int với cùng độ dài thành một vector của cặp int trong C++

A = [1, 2, 3 ,4]; 
B = [1, 2, 3, 4]; 

Làm thế nào tôi có thể ghép lại thành một vector của các cặp:

[(1,1), (2,2), (3,3), (4, 4)] 

Tất nhiên tôi có thể làm điều đó với vòng lặp. Nhưng chúng ta có thể làm điều đó bằng cách sử dụng các hàm STL và vòng lặp thích hợp không?

+1

Tăng cường nó, tôi nghĩ rằng, http://stackoverflow.com/questions/8511035/sequence-zip-function-for-c11 –

+0

http://stackoverflow.com/questions/17287107/pythons-zip-equivalent-in -c-or-c –

Trả lời

20

Bạn có thể sử dụng một thuật toán cho việc này:

std::vector<std::pair<int, int>> target; 
target.reserve(A.size()); 
std::transform(A.begin(), A.end(), B.begin(), std::back_inserter(target), 
       [](int a, int b) { return std::make_pair(a, b); }); 
+2

Lưu ý rằng nó không thực sự giúp loại bỏ vòng lặp. Vòng lặp sẽ được ẩn trong 'std :: transform()'. Ngoài ra một vòng lặp rõ ràng sẽ ngắn hơn và rõ ràng hơn trong trường hợp cụ thể này. – Karadur

+13

@Karadur: Bạn không thể áp dụng một phép toán cho các phần tử N mà không cần lặp lại qua các phần tử, điều đó chỉ đơn giản là rõ ràng: nén hai chuỗi không thể được thực hiện trong O (1). Câu hỏi này cũng khá rõ ràng như những gì mong muốn: * chúng ta có thể làm điều đó bằng cách sử dụng các hàm STL thích hợp và các trình lặp không? *. Câu trả lời này thực hiện chính xác điều đó. –

+1

Bạn thậm chí có thể bỏ qua lambda và sử dụng 'make_pair' trực tiếp, phải không? – jrok

6

Tôi đồng ý rằng câu trả lời Dietmar Kuhl của không chính xác những gì được yêu cầu trong câu hỏi, nhưng tôi cũng đồng ý với bình luận Kakadur của. Một vòng lặp được ẩn trong std::transform() do đó độ phức tạp là như nhau. Một số người sẽ phán xét, nhưng nếu không có bằng chứng trực tiếp của một trong những cách là tốt hơn hơn người kia, tôi có xu hướng chọn phiên bản có thể đọc được nhất và tiết nhất:

// create a vector of length of the smaller vector 
std::vector<std::pair<int, int>> target(A.size() < B.size() ? A.size() : B.size()); 

for (unsigned i = 0; i < target.size(); i++) 
    target[i] = std::make_pair(A[i], B[i]); 

T.B. Mã ở trên chỉ phân bổ đủ dung lượng cho véc tơ target, sao cho chi phí tiềm năng của push_back (trong trường hợp phân bổ lại) có thể tránh được.

+0

bạn biết đấy, có một vòng lặp tiềm ẩn bị ẩn trong 'push_back' cũng như –

+0

Vâng, vâng, nhưng nếu sự tái phân bổ xảy ra. Cảm ơn gợi ý, tôi sẽ cập nhật câu trả lời của tôi – Oleksiy

+0

* "Tuy nhiên, đối với hầu hết mọi người, phiên bản này dễ đọc hơn và rõ ràng hơn" * - Vâng, với những người không quen với thư viện chuẩn (và do đó C++). Và nó không thực sự trả lời câu hỏi, phải không? –

Các vấn đề liên quan