2017-06-06 19 views
12

tôi có thể dễ dàng mô phỏng một vòng lặp for .. in sử dụng danh sách initializer để truy cập đọcLàm cách nào để sử dụng vòng lặp danh sách khởi tạo để sửa đổi các phần tử?

std::list<int> foo, bar, baz; 

int main() 
{ 
    foo.push_back(3); 
    foo.push_back(2); 
    bar.push_back(1); 
    for (auto &x : {foo, bar, baz}) { 
    // x.push_back(42); 
    std::cout << x.size() << std::endl; 
    } 
    return 0; 
} 

này in:

2 
1 
0 

Tôi nên làm gì để tôi có thể sửa đổi các đối tượng thực tế, cũng giống như trong các nhận xét dòng:

// x.push_back(42); 
+2

Rất liên quan chặt chẽ: https://stackoverflow.com/questions/31724863/range-based-for-with -brace-initializer-over-non-const-values ​​ –

Trả lời

17

Bạn có thể sử dụng std::reference_wrapper:

for (std::list<int>& x : {std::ref(foo), std::ref(bar), std::ref(baz)}) { 
    x.push_back(42); 
    std::cout << x.size() << std::endl; 
} 
+0

Tôi đang xem [tham chiếu C++] (http://en.cppreference.com). Ở đâu là std :: reference_wrapper gọi ra? I E. Công cụ đó là gì, nó hoạt động như thế nào, nó làm gì, vv? – zipzit

+0

@zipzit http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper –

20

Bí quyết dựa trên con trỏ mà chúng tôi biết từ C có thể được áp dụng như sau

for (auto x : { &foo, &bar, &baz }) { 
    x->push_back(42); 
    std::cout << x->size() << std::endl; 
    } 

Tuy nhiên, điều này giả định rằng bạn thực sự muốn làm việc với các đối tượng gốc gốc, trái với bản sao của chúng. (Mã bạn gửi ban đầu thực sự hoạt động theo bản sao.)

+0

Đó là một điểm tốt! Tôi đã khá chắc chắn rằng tôi đang làm việc với các đối tượng gốc – marmistrz

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