Thắc mắc xóa 1 phần tử và xóa nhiều phần tử trong C++

Các anh cho em hỏi về C++ với ạ:

  • Nếu xóa 1 phần tử trong mảng biết trước vị trí k:
for(i=k; i<n; i++)
{
    a[i]=a[i+1];
};
n--;
  • Nếu không biết trước vị trì:
cout<<"Moi nhap k: ";
cin>>k;
for(i=0; i<n; i++)
{
    if(a[i]=k)
    {
        a[i]=a[i+1];
        n--;
    }
}

em viết 2 code như trên kia có đúng không ạ???
ở trường hợp 2: em thử test với dãy n=5, arr= 1 2 3 2 5 và k=2 vậy là lẽ ra kết quả phải là: 1 3 5 chứ sao nó cứ ra 1 3 3 hoài ạ

1 Like

Cần gì phức tạp thế bạn, trong C++ có hỗ trợ cho việc thêm / xóa ít / nhiều phần tử của mảng, chuỗi, vector … mà :slight_smile:

str.erase(x, y); // Xóa đi y ký tự bắt đầu tại vị trí x.
str.erase(str.begin() + x); // Xóa đi ký tự tại vị trí x.
str.erase(str.begin() + x, str.begin() + y); // Xóa đi các ký tự từ chỉ số x đến chỉ số y - 1

str.insert(x, "y"); // Thêm chuỗi y vào vị trí x.
str.insert(x, "y", z); // Thêm z ký tự từ chuỗi y vào vị trí x. Nếu z có độ dài lớn hơn độ dài chuỗi y thì tiếp tục thêm vào 1 khoảng trắng và sau đó lại bắt đầu thêm vào các ký tự của chuỗi từ vị trí 0 --> sao cho đủ z thì thôi.

str.insert(x, y, 'z'); // Thêm y lần ký tự z vào vị trí x.
str.insert(str.begin() + x, 'y'); // Thêm ký tự y vào vị trí x.
str.insert(str.begin() + x, y, 'z'); // Thêm y lần ký tự z vào vị trí x.
str.insert(str.begin() + x, str2.begin() + y, str2.begin() + z); // Thêm chuỗi ký tự con của chuỗi str2 bắt đầu từ vị trí y cho đến vị trí z - 1 vào vị trí x trong chuỗi str.

int found = str.find('x');
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của ký tự x trong chuỗi str.
else => Không tồn tại ký tự x trong chuỗi str. 

int found = str.find("x");
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của chuỗi x trong chuỗi str.
else => Không tồn tại chuỗi x trong chuỗi str. 

int found = str.find("x", y, z);
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của chuỗi x lấy ra z ký tự và sẽ bắt đầu tìm kiếm từ vị trí y trong chuỗi str.
else => Không tồn tại chuỗi x trong chuỗi str.
13 Likes

i<n-1 mới đúng nhé :smiley:

Không nên lợi dụng, sử dụng hàm có sẵn với những bài toán như thế này!

1 Like

@HienVienVu code sau của bạn bị sai nhé, mỗi lần xóa 1 phần tử bạn phải dồn hết các phần tử còn lại lên rồi mới xét đến phần tử tiếp theo. Tốt nhất với bài xóa nhiều phần tử này bạn nên dùng vòng lặp ngoài là while

1 Like

Đúng rồi, nên tập làm hàm cho riêng mình để xử lý luyện logic.
Nhưng khi quen rồi thì cũng không nên viết hàm riêng mà nên dùng hàm có sẵn. Vì hàm có sẵn chạy nhanh, mấy bạn giải thuật thi olympic đều nhớ những hàm như thế này :slight_smile:

P/S: Trong C không có mấy hàm hỗ trợ như thế này nên việc xử lý mảng hơi mệt đối với những người “lười” hoặc học C++ trước đó (my personal idea) :smile:

2 Likes

Có chắc là chạy nhanh hơn với những hàm trên không ?
Khi độ phức tạp là 0(n^2)

Hàm được xây dựng sẵn bao giờ cũng nhanh hơn hàm do mình viết ra mà anh ?

Anh nghĩ em nên chắc chắn về những gì mình đang nói.
Đơn giản như thuật toán xóa 1 phần tử trong arrayList của Java là một hàm dựng sẵn và độ phức tạp thuật toán của nó là O(n^2).
Rõ ràng là nó sẽ lâu rất lâu so với việc sử dụng LinkList trong trường hợp xấu nhất(thường trong các kì thi olympic lớn thường sẽ đánh vào đó)

update:
Hàm đó, vừa được cập nhật lại một hàm mới : 0(n).


Kết luận:

  • Nếu mới học để hiểu vấn đề thì đừng khuyên họ dùng hàm có sẵn. Để nắm vấn đề rõ hơn trước
    Kể cả việc đi học trên trường thầy cô giáo cũng căn dặn không nên lạm dụng hàm có sẵn(Tức là bất đắc dĩ mới dùng)
  • Hàm được viết sẵn không phải bao giờ cũng tốt? Nếu tốt rồi thì việc gì học phải liên tục update sửa đổi.
    Không biết mọi người thế nào nhưng tự mình viết ra cái hàm rồi dùng để xử lý bài toán của mình cũng thú vị mà :smiley:
4 Likes

Thanks anh ^^
Giờ mới thông não ra

1 Like

bạn có thể cho mik xin tài liệu c++ ko ạ…tài liệu có mấy câu lệnh gọn như thế này ạ

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Nếu xóa nhiều vị trí thì bạn lưu số phần tử đã xóa (gọi là d), sau đó thì a[i-d] = a[i].

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