01/10/2018, 01:00
Thêm phần tử vào sai vị trí trong list?
Hi mọi người,
Mình có 1 đoạn code như sau:
int main()
{
std::list<int> mylist;
for (int i = 0; i < 8; ++i) // 1 2 3 4 5 6 7 8
mylist.push_back(i + 1);
mylist.insert(mylist.begin(), 0); // thêm phần tử 0 vào đầu list
mylist.insert(mylist.end(), 4, 12);
mylist.insert(mylist.end(), 13); // thêm phần tử 13 vào cuối list
auto it = mylist.begin();
++it; // cho con trỏ it trỏ đến phần tử thứ hai trong list
mylist.insert(++it, 2, 3); // thêm 2 lần phần tử 3 vào vị trí 3 trong list
std::cout << "Original list: ";
for (auto &var : mylist)
std::cout << var << " ";
std::cout << std::endl;
mylist.erase(--mylist.end()); // xóa phần tử cuối cùng trong list
mylist.erase(++it); // xóa phần tử ở vị trí 4 trong list
std::cout << "
Last list: ";
for (auto &var : mylist)
std::cout << var << " ";
return 0;
}
Đoạn code trên chỉ thêm/xóa rồi xuất như bình thường thôi.
Đây là kết quả chương trình xuất ra:
Nếu để ý thì mình thấy ở dòng này:
mylist.erase(++it); // xóa phần tử ở vị trí 4 trong list
nó phải xóa đi phần tử ở vị trí 3 (tính từ vị trí 0) chứ sao nó lại xóa đi phần tử ở vị trí 5 nhỉ ? vì con trỏ it
đang trỏ tới vị trí 3.
Nhờ mọi người giúp mình chỗ này, chứ mình mò sáng giờ mà không hiểu vì sao.
Mình cảm ơn !
Bài liên quan
Bạn thử chuyển thành
mylist.erase(it++);
Không có ích đâu.
Mình đã phát hiện ra.
Thực ra
it
là 1 con trỏ nên khi cho nó trỏ đến phần tử vị trí 2 (phần tử 2) thì nó sẽ nằm mãi ở ô đó dù có thêm bao nhiêu phần tử, đó là vì sao khi để dòngmylist.erase(++it)
thì nó xóa ở thằng nằm sau phần tử 2 (là phần tử 3).Nên bây giờ reset
it
lại bằngmylist.begin()
rồi dùng hàmadvance()
cho nó tới vị trí mình muốn xóa thôi