TỔ TIN HỌC TRƯỜNG THPT ĐỖ CÔNG TƯỜNG

https://tinhocdct.xyz

[C++]. Kiểu Dữ Liệu Suy Luận Auto Trong C++

Từ khóa auto trong C++ giúp bạn có thể suy luận ra kiểu dữ liệu tương ứng phù hợp với một biến thông qua giá trị mà biến được gán. Từ C++11 trở về sau thì ta có sử dụng kiểu auto để thay cho các kiểu dữ liệu phức tạp trong C++
[C++]. Kiểu Dữ Liệu Suy Luận Auto Trong C++
1. Từ Khóa auto 
Từ khóa auto hay mình tạm gọi là kiểu auto là một tính năng mới từ C++11 tới các phiên bản mới hơn sau này, trước C++11 thì ngôn ngữ lập trình C++ khi khai báo biến bạn phải chỉ ra kiểu dữ liệu tương ứng của biến đó.
Từ khóa auto giúp tự suy luận ra kiểu dữ liệu phù hợp với biến thông qua giá trị bạn gán cho biến đó, đặc điểm này khá giống với các ngôn ngữ lập trình Dynamically Typed Languages như Python.
Nếu bạn đã từng học qua Python thì khi khai báo biến bạn không cần khai báo kiểu dữ liệu cho biến mà kiểu dữ liệu sẽ được tự động xác định dựa vào giá trị mà biến được khởi tạo
Sử dụng từ khóa auto, kiểu dữ liệu của biến sẽ được xác định lúc runtime thay vì compile-time như trước.
Ví dụ 1: 
#include <iostream>
#include "typeinfo"

using namespace std;

int main(){
   auto x = 100;
   auto y = 30.5f;
   auto z = '@';
   auto t = 1000000000000000;
   auto p = make_pair(10, 20);
   auto l = 30.5d;
   cout << "Kieu du lieu cua x : " << typeid(x).name() << endl;
   cout << "Kieu du lieu cua y : " << typeid(y).name() << endl;
   cout << "Kieu du lieu cua z : " << typeid(z).name() << endl;
   cout << "Kieu du lieu cua t : " << typeid(t).name() << endl;
   cout << "Kieu du lieu cua p : " << typeid(p).name() << endl;
   cout << "Kieu du lieu cua l : " << typeid(l).name() << endl;
   return 0;
}
Output 
Kieu du lieu cua x : i
Kieu du lieu cua y : f
Kieu du lieu cua z : c
Kieu du lieu cua t : x
Kieu du lieu cua p : St4pairIiiE
Kieu du lieu cua l : d
Giải thích : 
Ở đây mình sử dụng toán tử typeid() để có thể lấy về kiểu dữ liệu cho biến
  • Biến x được gán giá trị 30 nên có kiểu là integer (i)
  • Biến y được gán giá trị 30.5f nên có kiểu là float (f)
  • Biến z được gán giá trị '@' nên có kiểu là char(c)
  • Biến t được gán giá trị 1000000000000000 nên có kiểu là long long (x)
  • Biến p được gán giá trị là một pair(10, 20) nên có kiểu là pair (St4pairIiiE)
  • Biến l được gán giá trị là 30.5d nên có kiểu là double (d) 
Chú ý : Bạn không thể khai báo biến có kiểu auto mà không khởi tạo giá trị cho nó 
Thông thường mình chỉ dùng auto để thay cho các kiểu dữ liệu dài dòng như : pair, iterator, con trỏ... Nếu bạn chưa biết kiến thức về iterator và con trỏ thì có thể tạm thời bỏ qua ví dụ này nhé.
Ví dụ 2 : 
#include <iostream>
#include "typeinfo"

using namespace std;

int main(){
   auto p = make_pair(10, 20);
   cout << p.first << ' ' << p.second << endl;
   int n = 100;
   auto ptr1 = &n;
   cout << "ptr1 la kieu con tro : " << typeid(ptr1).name() << endl;
   auto ptr2 = &ptr1;
   cout << "ptr2 la kieu con tro cap 2 : " << typeid(ptr2).name() << endl;
   return 0;
}
Output 
10 20
ptr1 la kieu con tro : Pi
ptr2 la kieu con tro cap 2 : PPi
2. Auto Và Vector 
Kiến thức về vector nếu bạn chưa học có thể bỏ qua phần này và khi học xong vector có thể tiếp tục tham khảo.
Thông thường để duyệt qua vector bạn có thể dùng iterator, tuy nhiên đôi khi việc khai báo iterator quá dài dòng nên bạn có thể thay nó bằng kiểu auto
Ví dụ : 
#include <iostream>
#include <vector>

using namespace std;

int main(){
   vector<int> v = {1, 2, 3, 4, 5};
   cout << "Duyet vector bang range-based for loop : \n";
   for(auto x : v){
      cout << x << ' ';
   }
   cout << endl;
   cout << "Duyet vector bang iterator : \n";
   for(auto it = v.begin(); it != v.end(); ++it){
      cout << *it << ' ';
   }
   return 0;
}
Output 
Duyet vector bang range-based for loop :
1 2 3 4 5
Duyet vector bang iterator :
1 2 3 4 5
Giải thích : 
  • auto x khi dùng trong range-based for loop thì x đóng vai trò là int
  • auto it = v.begin() thì it đóng vai trò là iterator nên khi truy xuất giá trị trong vector bạn cần giải tham chiếu 
3. Auto Và Set 
Kiến thức về set nếu bạn chưa học có thể bỏ qua phần này và khi học xong vector có thể tiếp tục tham khảo.
Trong ví dụ này mình sẽ dùng kiểu auto để thay cho iterator, string... khi áp dụng với set 
Ví dụ : 
#include <iostream>
#include <set>

using namespace std;

int main(){
   set<string> se = {"28tech", "c++", "python", "c++", "java"};
   cout << "Duyet set bang range-based for loop : \n";
   for(auto x : se){
      cout << x << " ";
   }
   cout << endl;
   auto pos = se.find("28tech");
   if(pos == se.end()){
      cout << "NOT FOUND";
   }
   else{
      cout << "FOUND\n";
   }
}
Output 
Duyet set bang range-based for loop :
28tech c++ java python
FOUND
Giải thích : 
  • auto x khi duyệt set thì x có kiểu dữ liệu là string
  • auto pos = se.find("28tech") được gán giá trị trả về của hàm find nên pos có kiểu là set::iterator 
4. Auto Và Map
Kiến thức về map nếu bạn chưa học có thể bỏ qua phần này và khi học xong vector có thể tiếp tục tham khảo.
Ví dụ : 
#include <iostream>
#include <map>

using namespace std;

int main(){
   map<string, string> mp;
   mp.insert({"28tech", "28tech.com.vn"});
   mp.insert({"Meta", "facebook.com"});
   mp.insert({"X", "twitter.com"});
   cout << "Duyet map bang range-based for loop : \n";
   for(auto p : mp){
      cout << p.first << ' ' << p.second << endl;
   }
   cout << "Duyet map bang iterator : \n";
   for(auto it = mp.begin(); it != mp.end(); ++it){
      cout << it->first << ' ' << it-> second << endl;
   }
}
Output 
Duyet map bang range-based for loop :
28tech 28tech.com.vn
Meta facebook.com
X twitter.com
Duyet map bang iterator :
28tech 28tech.com.vn
Meta facebook.com
X twitter.com
Giải thích : 
  • auto p thì p có kiểu dữ liệu là pair 
  • auto it = mp.begin() thì it có kiểu dữ liệu là map::iterator 
 
bai truocbai tiep
 

Tác giả bài viết: Thanh Sơn

Nguồn tin: blog.28tech.com.vn

Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây