Hướng dẫn remove from set c++ - xóa khỏi bộ c ++

Hướng dẫn cách xóa set trong C++. Bạn sẽ học được cách sử dụng hàm set erase C++ để xóa phần tử trong set sau bài học này.

Để xóa phần tử trong set trong C++, chúng ta sử dụng tới hàm thành viên erase(). Do khi xóa phần tử trong set thì các phần tử còn lại sẽ được tự động sắp xếp, nên lưu ý khác với các containers khác như set hay vector thì trong set không tồn tại các hàm pop_front() hay pop_back() để xóa phần tử ở đầu hay cuối set.

Xóa 1 phần tử trong set bằng hàm erase c++

erase trong c++ là một hàm thành viên trong class std:set, có tác dụng xóa một hoặc nhiều phần tử trong set C++ cũng như làm giảm độ dài tương ứng của nó.

Để xóa 1 phần tử trong set c++ chúng ta sử dụng hàm erase với một trong 2 cú pháp sau đây:

st.erase(itr);ORst.erase(value);
OR
st.erase(value);

Trong đó st là set ban đầu, itrvalue là trình lặp hoặc là giá trị của phần tử cần xóa.

Nếu sử dụng erase(itr) thì hàm sẽ xóa đi phần tử tại vị trí mà trình lặp xác định bởi itr chỉ đến.

Và nếu sử dụng

#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
0 thì hàm sẽ tìm phần tử có giá trị bằng với value trong list và tiến hành xóa nó đi.

Ở đây trình lặp (iterator) là một vòng lặp có tác dụng giống như con trỏ, giúp truy cập đến các phần tử ở vị trí cụ thể trong set.

Khác với các container khác thì để chuyển trình lặp chỉ đến vị trí index thứ n trong set, chúng ta không thể đơn giản cộng vào n vào trình lặp, mà cần phải di chuyển lần lượt qua từng vị trí, bằng toán tử ++ với đủ số vòng lặp.

Ví dụ, trong trường hợp cần chỉ đến vị trí index thứ 5 trong set, chúng ta sẽ viết trình lặp p như sau:

int n = 5;
auto itr = st.begin();
for (int i=1; i <= n; i++ )
++itr;

Hàm set erase sẽ trả về số lượng phần tử đã được xóa đi từ set ban đầu.

Lưu ý phần tử trong set được sắp xếp theo thứ tự cụ thể trước khi được lưu, nên các phần tử còn lại sau khi xóa phần tử trong set sẽ được tự động quyết định vị trí dựa trên bộ sắp xếp. Do đó chúng ta sẽ không quyết định được vị trí của các phần tử sau khi xóa đi phần tử từ set.

Ví dụ cụ thể:

#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}

Kết quả:

1 3 5 6 7
1 5 6 7
1 5 7

Chúng ta cũng có thể kiểm tra số phần tử đã được xóa đi từ kết quả trả về của hàm như sau:

#include 
#include
using namespace std;

int main ()
{
set<int> st{1, 3, 6, 7, 5};
auto r = st.erase(2);
std::cout << r << "\n";


r = st.erase(6);
std::cout << r << "\n";


return 0;
}

Xóa các phần tử trong một phạm vi chỉ định bằng set erase c++

Chúng ta sử dụng set erase c++ để xóa các phần tử trong một phạm vi chỉ định của một set với cú pháp sau đây:

st.erase( iterator_first, iterator_last);

Trong đó st là set ban đầu,

#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
2 và
#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
3 là các trình lặp trỏ đến phạm vi bắt đầu và kết thúc xóa.

Lưu ý là phạm vi xóa là [first,last) sẽ được tính từ

#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
2 đến trước
#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
3, nghĩa là phần tử ở vị trí
#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
2 sẽ được xóa nhưng phần tử ở vị trí
#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}

int main ()
{
set<int> st{1, 3, 6, 7, 5};
dump(st);


auto itr = st.begin();
++itr;


st.erase(itr);
dump(st);


st.erase(6);
dump(st);

return 0;
}
3 sẽ không bị xóa đi.

Và các giá trị trình lặp (iterator) này được tính sau khi các phần tử đã được sắp xếp và lưu trong set, chứ không phải là theo thứ tự các phần tử khi chúng ta khai báo set.

Ứng dụng điều này, chúng ta có thể chỉ định trình lặp và xóa đi các phần tử trong phạm vi chỉ định từ set như sau:

#include 
#include
using namespace std;


void dump(set<int>& st)
{
for (auto x: st) {
cout << " "<< x ;
}
cout << endl;
}


int main ()
{
set<int> st{1, 3, 6, 7, 5, 9, 2};
dump(st);
int n;

int start = 2, end =5;


auto itr_start = st.begin();
auto itr_end = st.begin();


for (int i=1; i <= start; i++ )
++itr_start;
for (int i=1; i <= end; i++ )
++itr_end;


st.erase(itr_start, itr_end);
dump(st);

return 0;
}

Kết quả:

1 2 3 5 6 7 9
1 2 7 9

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách xóa phần tử trong set C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

Viết bởi Kiyoshi. Đã đăng ký bản quyền tác giả tại Creativecommons và DMCA