2009-06-23 47 views
34

Tôi có thể thực hiện các phép tính bình thường với các trình vòng lặp hay không, tức là chỉ tăng thêm bằng cách thêm một số?Tôi có thể tăng thêm một trình lặp bằng cách thêm một số không?

Như một ví dụ, nếu tôi muốn loại bỏ các yếu tố vec[3], tôi có thể chỉ làm điều này:

std::vector<int> vec; 
for(int i = 0; i < 5; ++i){ 
     vec.push_back(i); 
} 
vec.erase(vec.begin() + 3); // removes vec[3] element 

Nó làm việc cho tôi (g ++), nhưng tôi không chắc chắn nếu nó là đảm bảo làm việc.

Trả lời

42

Nó hoạt động nếu trình vòng lặp là một trình vòng lặp truy cập ngẫu nhiên, các trình vòng lặp của vectơ là (xem reference). Chức năng STL std::advance có thể được sử dụng để nâng cấp một trình lặp chung, nhưng vì nó không trả về trình lặp, tôi có xu hướng sử dụng + nếu có vì nó trông sạch hơn.

C++ 11 lưu ý

Bây giờ có std::nextstd::prev, mà làm trả lại iterator, vì vậy nếu bạn đang làm việc trong mẫu đất bạn có thể sử dụng chúng để thúc đẩy một iterator chung chung và vẫn mã sạch.

+7

Ồ, vì vậy nó sẽ không hoạt động cho std :: list? – Frank

+2

Chính xác; đã thêm một số liên kết tài liệu liệt kê các chức năng nào sẽ có sẵn cho các loại trình vòng lặp nào. –

+1

Không, không. Toán tử + có nghĩa là "trong một bước, nhảy xa về phía trước" mà một trình vòng lặp danh sách không thể thực hiện được. Chuyển tiếp các trình vòng lặp truy cập không ngẫu nhiên (như trình vòng lặp danh sách) chỉ hỗ trợ toán tử increment (++) để thúc đẩy một phần tử tại một thời điểm. Như Todd đã nói, bạn có thể sử dụng lệnh std :: advance, điều này gọi lặp đi lặp lại toán tử ++, để nhanh chóng thể hiện ý tưởng di chuyển một trình lặp không ngẫu nhiên về phía trước bằng một số bước. –

2

Nó hoạt động với các trình vòng lặp truy cập ngẫu nhiên. Nói chung, bạn có thể muốn xem std::advance đó là tổng quát hơn. Chỉ cần chắc chắn hiểu được ý nghĩa hiệu suất của việc sử dụng mẫu chức năng này.

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