Một số thắc mắc về vòng lặp cho Vector

Chào mọi người,

Minh có một vài thắc mắc về vòng lặp của Vector, mong mọi người giải đáp :

  1. Mình thấy khi sử dụng vòng lặp cho vector người ta thường hay viết là for(auto i : myvector) hoặc for(auto& i : myvector). Mình không hiểu là trong trường hợp nào nên sử dụng cách viết thứ nhất (auto) và trong trường hợp nào nên sử dụng cách viết thứ hai (auto&) ? Nếu được thì mong mọi người cho mình ví dụ để thấy rõ sự khác biệt giữa 2 cách viết này.

  2. Mình muốn hỏi thêm là hai cách viết này : for(auto i : myvector)for(auto i != myvector.begin(); i != myvector.end(); i++) có tương đương nhau không ? Trong trường hợp nào thì mình nên sử dụng cách viết thứ nhất và trong trường hợp nào nên sử dụng cách viết thứ hai ?

Cảm ơn mọi người.

  1. Nếu phần tử là primitive thì const auto& hay auto cũng không ảnh hưởng, ngược lại để tránh copy thì cần dùng const auto&.
  2. Theo chuẩn là tương đương (và thực tế là asm sinh ra giống nhau -O3). Nhưng foreach mỗi lần lặp chỉ tiến 1 bước. Foreach được chuộng vì cú pháp tương đối trong sáng (chú ý const auto&), nếu không cần nhảy nhiều bước (stride) thì nên dùng. Ngoài ra mỗi bước lặp cứ phải gọi end() hoài thì ko nên.
3 Likes

Cảm ơn câu trả lời của bạn

viết cách thứ 2 khi ko được viết theo cách thứ nhất, ví dụ C++98…

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?