2009-12-01 21 views
11

Cách tốt nhất để lặp qua tất cả các cặp phần tử trong vùng chứa std như std::list, std::set, std::vector, v.v ...?Lặp lại tất cả các cặp thành phần trong std-containers (C++)

Về cơ bản để làm tương đương với điều này, nhưng với vòng lặp:

for (int i = 0; i < A.size()-1; i++) 
    for(int j = i+1; j < A.size(); j++) 
     cout << A[i] << A[j] << endl; 

Trả lời

11

Cách đơn giản nhất là chỉ cần viết lại mã theo nghĩa đen:

for (auto i = foo.begin(); i != foo.end(); ++i) { 
    for (auto j = i; ++j != foo.end(); /**/) { 
    std::cout << *i << *j << std::endl; 
    } 
} 

Thay auto với một const_iterator cho C++ 98/03. Hoặc đặt nó vào chức năng riêng của mình:

template<typename It> 
void for_each_pair(It begin, It end) { 
    for (It i = begin; i != end; ++i) { 
    for (It j = i; ++j != end; /**/) { 
     std::cout << *i << *j << std::endl; 
    } 
    } 
} 
+0

'auto' không phải là một phần của tiêu chuẩn hiện tại. –

+0

Đúng, lười biếng ở đây. Đã thêm nhận xét. – MSalters

+0

Gọn gàng! Bạn đang ở chế độ 1x! – xtofl

1

Chỉ cần đi qua, const_iterators sử dụng. Nếu bạn muốn sửa đổi các giá trị, hãy sử dụng trình lặp.

Ví dụ:

typedef std::vector<int> IntVec; 

IntVec vec; 

// ... 

IntVec::const_iterator iter_cur = vec.begin(); 
IntVec::const_iterator iter_end = vec.end(); 
while (iter_cur != iter_end) { 
    int val = *iter_cur; 
    // Do stuff with val here 
    iter_cur++; 
} 
Các vấn đề liên quan