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 !

Pham Van Hai viết 03:03 ngày 01/10/2018

mylist.erase(++it); // xóa phần tử ở vị trí 4 trong list

Bạn thử chuyển thành mylist.erase(it++);

Người bí ẩn viết 03:00 ngày 01/10/2018

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òng mylist.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ằng mylist.begin() rồi dùng hàm advance() cho nó tới vị trí mình muốn xóa thôi

Bài liên quan
0