Tìm phần tử trong multimap C++ (find, lower_bound, upper_bound, equal_range, cout) | Laptrinhcanban.com

Tìm phần tử trong multimap C++ (find, lower_bound, upper_bound, equal_range, cout)

Hướng dẫn cách tìm phần tử trong multimap. Bạn sẽ học được cách sử dụng các hàm như find, lower_bound, upper_bound và equal_range để tìm phần tử trong multimap, cũng như hàm cout() để đếm số lần xuất hiện của phần tử đó theo khóa trong multimap C++ sau bài học này.

Tìm phần tử trong multimap C++ bằng hàm find

Hàm find là một hàm thành viên trong class std:multimap, có tác dụng tìm vị trí phần tử đầu tiên có khóa chỉ định trong multimap.

Chúng ta sử dụng hàm find trong C++ với cú pháp sau đây:

mp.find(key);

Trong đó key là khóa của phần tử cần tìm trong multimap mp.

Hàm find() sẽ trả về trình lặp trỏ đến vị trí phần tử, nếu nó tồn tại trong multimap. Và nếu phần tử đó không tồn tại, hàm sẽ trả về trình lặp trỏ đến vị trí cuối cùng trong multimap.

Lưu ý là hàm find() chỉ trả về một trình lặp cho một phần tử duy nhất mà thôi. Để có được toàn bộ phạm vi các phần tử có khóa chỉ định, hãy dùng hàm equal_range mà Kiyoshi sẽ giới thiệu ở phần dưới.

Bằng cách ứng dụng hàm find(), chúng ta có thể tìm ra vị trí của một phần tử thông qua khóa trong multimap, rồi kết hợp với hàm clear() để xóa nó đi như ví dụ cụ thể sau đây:

#include <iostream>
#include <map>
using namespace std;

//Tạo hàm xuất multimap
void dump(multimap<char,int>& mp)
{
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
}

int main() {
multimap<char,int> mp;
mp.insert(make_pair('a', 1));
mp.insert(make_pair('b', 2));
mp.insert(make_pair('e', 5));
mp.insert(make_pair('c', 3));
mp.insert(make_pair('d', 1));
mp.insert(make_pair('e', 2));
mp.insert(make_pair('f', 3));
mp.insert(make_pair('e', 8));
dump(mp);

//Tìm phần tử có khóa bằng 'b' trong multimap
auto itr = mp.find('e');

//Xóa phần tử vừa tìm thấy
mp.erase (itr);
dump(mp);

return 0;
}

Kết quả:

a:1 b:2 c:3 d:1 e:5 e:2 e:8 f:3 
a:1 b:2 c:3 d:1 e:2 e:8 f:3

Giống như trên, mặc dù có 3 phần tử có khóa ‘e’ giống với khóa chỉ định, nhưng hàm find() chỉ trả về trình lặp trỏ đến phần tử đầu tiên mà thôi.

Tìm phần tử trong multimap C++ bằng hàm equal_range

Hàm equal_range là một hàm thành viên trong class std:multimap, có tác dụng tìm phạm vi của tất cả các phần tử có khóa giống với khóa chỉ định trong multimap.

Chúng ta sử dụng hàm equal_range trong C++ với cú pháp sau đây:

mp.equal_range(key);

Trong đó key là khóa của phần tử cần tìm trong multimap mp.

Hàm equal_range() sẽ trả về một cặp giá trị, với giá trị đầu tiên trỏ đến đầu phạm vi, và giá trị thứ hai trỏ đến cuối phạm vi chứa tất cả các phần tử có khóa giống khóa chỉ định.

Bằng cách ứng dụng hàm equal_range(), chúng ta có thể tìm ra phạm vi chứa kết quả tìm kiếm, rồi kết hợp với hàm clear() để xóa nó đi như ví dụ cụ thể sau đây:

#include <iostream>
#include <map>
using namespace std;

//Tạo hàm xuất multimap
void dump(multimap<char,int>& mp)
{
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
}

int main() {
multimap<char,int> mp;
mp.insert(make_pair('a', 1));
mp.insert(make_pair('b', 2));
mp.insert(make_pair('e', 5));
mp.insert(make_pair('c', 3));
mp.insert(make_pair('d', 1));
mp.insert(make_pair('e', 2));
mp.insert(make_pair('f', 3));
mp.insert(make_pair('e', 8));
dump(mp);

//Tìm phần tử có khóa bằng 'b' trong multimap
auto ret = mp.equal_range('e');

//Xóa phần tử vừa tìm thấy
mp.erase (ret.first,ret.second);
dump(mp);

return 0;
}

Kết quả:

a:1 b:2 c:3 d:1 e:5 e:2 e:8 f:3 
a:1 b:2 c:3 d:1 f:3

Giống như trên, toàn bộ phạm vi chứa các phần tử có khóa giống khóa ‘e’ chỉ định đã được xác định bởi hàm equal_range() và được xóa đi.

Tìm phần tử trong multimap C++ bằng hàm lower_bound

Hàm lower_bound là một hàm thành viên trong class std::multimap, có tác dụng tìm vị trí phần tử đầu tiên trong multimap có khóa lớn hơn hoặc bằng với khóa chỉ định.

Chúng ta sử dụng hàm lower_bound trong C++ với cú pháp sau đây:

mp.lower_bound(key);

Trong đó key là khóa của phần tử cần tìm trong multimap mp.

Hàm lower_bound() sẽ trả về trình lặp trỏ đến vị trí phần tử đầu tiên có khóa lớn hơn hoặc bằng với khóa chỉ định. Và nếu không tìm thấy, hàm sẽ trả về trình lặp trỏ đến vị trí cuối cùng trong map.

Trong trường hợp chỉ có một phần tử trong multimap có khóa giống với khóa chỉ định thì hàm lower_bound sẽ trả về con trỏ chỉ đến phần tử đó. Còn nếu có nhiều phần tử có khóa giống với khóa chỉ định, vị trí của phần tử đầu tiên có khóa lớn hơn khóa chỉ định sẽ được hàm lower_bound() trả về.

Bằng cách ứng dụng hàm lower_bound() kết hợp hàm upper_bound() mà Kiyoshi sẽ hướng dẫn ở phần dưới, chúng ta có thể tìm ra 2 vị trí rồi xóa các phần tử có trong phạm vi xác định bởi vị trí đó như ví dụ sau:

#include <iostream>
#include <map>
using namespace std;

//Tạo hàm xuất multimap
void dump(multimap<char,int>& mp)
{
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
}

int main() {
multimap<char,int> mp;
mp.insert(make_pair('a', 1));
mp.insert(make_pair('b', 2));
mp.insert(make_pair('e', 5));
mp.insert(make_pair('c', 3));
mp.insert(make_pair('d', 1));
mp.insert(make_pair('e', 2));
mp.insert(make_pair('f', 3));
mp.insert(make_pair('e', 8));
mp.insert(make_pair('b', 9));
dump(mp); //a:1 b:2 b:9 c:3 d:1 e:5 e:2 e:8 f:3

/*Tìm vị trí phần tử đầu tiên có khóa lớn hơn hoặc bằng 'b' trong multimap*/
auto itr1 = mp.lower_bound('b'); // itr1 trỏ đến b:2

//Tìm vị trí phần tử đầu tiên có khóa lớn hơn 'e' trong multimap
auto itr2 = mp.upper_bound('e'); // itr2 trỏ đến f:3

//Xóa các phần tử trong phạm vi [itr1, itr2)
mp.erase (itr1, itr2);
dump(mp); //a:1 f:3

return 0;
}

Kết quả, các phần tử trong phạm vi từ b:2 đến trước f:3 đã bị xóa đi.

a:1 b:2 c:3 d:1 e:2 f:3 
a:1 f:3

Tìm phần tử trong multimap C++ bằng hàm upper_bound

Ngược với hàm lower_bound chính là hàm upper_bound trong C++.

Hàm upper_bound là một hàm thành viên trong class std::multimap, có tác dụng tìm vị trí phần tử đầu tiên có khóa lớn hơn khóa chỉ định trong multimap.

Chúng ta sử dụng hàm upper_bound trong C++ với cú pháp sau đây:

mp.upper_bound(key);

Trong đó key là khóa của phần tử cần tìm trong multimap mp.

Hàm upper_bound() sẽ trả về trình lặp trỏ đến vị trí phần tử đầu tiên có khóa lớn hơn khóa chỉ định. Và nếu không tìm thấy, hàm sẽ trả về trình lặp trỏ đến vị trí cuối cùng trong map.

Trong trường hợp chỉ có một phần tử trong multimap có khóa giống với khóa chỉ định thì hàm upper_bound sẽ trả về con trỏ chỉ đến phần tử ngay sau nó. Còn nếu có nhiều phần tử có khóa giống với khóa chỉ định, vị trí của phần tử đầu tiên có khóa lớn hơn khóa chỉ định sẽ được hàm upper_bound() trả về.

Bằng cách ứng dụng hàm upper_bound() kết hợp hàm upper_bound() mà Kiyoshi đã hướng dẫn ở trên, chúng ta có thể tìm ra 2 vị trí rồi xuất các phần tử có trong phạm vi xác định bởi vị trí đó như ví dụ sau:

#include <iostream>
#include <map>
using namespace std;
int main() {
multimap<char,int> mp;
mp.insert(make_pair('a', 1));
mp.insert(make_pair('b', 2));
mp.insert(make_pair('e', 5));
mp.insert(make_pair('c', 3));
mp.insert(make_pair('d', 1));
mp.insert(make_pair('e', 2));
mp.insert(make_pair('f', 3));
mp.insert(make_pair('e', 8));
mp.insert(make_pair('b', 9));

/*Duyệt map mp*/
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
//a:1 b:2 b:9 c:3 d:1 e:5 e:2 e:8 f:3

/*Tìm vị trí phần tử đầu tiên có khóa lớn hơn hoặc bằng 'b' trong map*/
auto itr1 = mp.lower_bound('b'); // itr1 trỏ đến b:2

//Tìm vị trí phần tử đầu tiên có khóa nhỏ hơn 'e' trong map
auto itr2 = mp.upper_bound('e'); // itr2 trỏ đến f:3

//In các phần tử trong phạm vi [itr1, itr2)
for (auto it=itr1; it!=itr2; ++it)
cout << (*it).first << ":" << (*it).second << ' ';

return 0;
}

Kết quả:

a:1 b:2 b:9 c:3 d:1 e:5 e:2 e:8 f:3 
b:2 b:9 c:3 d:1 e:5 e:2 e:8

Đếm số lần xuất hiện của phần tử trong multimap C++ bằng hàm count

Hàm count là một hàm thành viên trong class std:multimap, có tác dụng đếm số lần xuất hiện của phần tử trong multimap C++ thông qua khóa của nó.

Chúng ta sử dụng hàm count trong C++ với cú pháp sau đây:

mp.count(key);

Trong đó key là khóa của phần tử cần đếm số lần xuất hiện trong multimap mp.

Hàm count() sẽ trả về số phần tử có khóa giống khóa chỉ định được tìm thấy trong multimap.

Ví dụ cụ thể:

#include <iostream>
#include <map>
using namespace std;

int main() {
multimap<char,int> mp;
mp.insert(make_pair('a', 100));
mp.insert(make_pair('b', 200));
mp.insert(make_pair('e', 500));
mp.insert(make_pair('c', 300));
mp.insert(make_pair('d', 100));
mp.insert(make_pair('e', 200));
mp.insert(make_pair('f', 300));

//Đếm số lần xuất hiện của phần tử tồn tại trong multimap
cout << mp.count('e') <<endl;

//Đếm số lần xuất hiện của phần tử không tồn tại trong multimap
cout << mp.count('x') <<endl;

return 0;
}

Kết quả:

2
0

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách tìm phần tử multimap trong 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.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.