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++
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"
usingnamespace std;
intmain(){ 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; return0; } 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"
usingnamespace std;
intmain(){ 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; return0; } Output : 1020 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>
usingnamespace std;
intmain(){ 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 <<' '; } return0; } Output : Duyet vector bang range-based for loop : 12345 Duyet vector bang iterator : 12345 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>
usingnamespace std;
intmain(){ 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>
usingnamespace std;
intmain(){ 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