vector trong c++

C++ là ngữ điệu mạnh mẽ và uy lực nhờ tính linh động, thân mật với ngữ điệu máy. Dường như còn tồn tại kĩ năng lập trình sẵn dựa vào khuôn mẫu đã có sẵn (template). Sức mạnh mẽ của C++ nằm ở vị trí STL (Standard Template Library) – một tủ sách template giành riêng cho C++ tổ hợp những cấu tạo tài liệu gần giống giải thuật và những vector vô C++ được kiến tạo một cơ hội tổng quát mắng mang lại nhiều tình huống.

Bộ tủ sách này tiến hành toàn cỗ những hoạt động và sinh hoạt rời khỏi vô của tài liệu (iostream), quản lý và vận hành mảng (vector) và đa số những tác dụng của những cấu tạo tài liệu cơ bạn dạng như (stack, queue, map, set…). Dường như, STL còn bao hàm những thuật toán cơ bản: tính tổng, lần min, max, bố trí (với phong phú và đa dạng thuật toán chuẩn bị xếp), thay cho thế những thành phần, lần tìm kiếm (tìm lần thông thường và lần tìm kiếm dười dạng nhị phân). Toàn cỗ những tác dụng bên trên đều được hỗ trợ bên dưới dạng template cho nên việc dùng bọn chúng đặc biệt tiện lợi và phù phù hợp với nhiều trường hợp. Nhờ vậy, STL thực hiện mang lại ngữ điệu C++ trở thành “xịn xò” rộng lớn.

Bạn đang xem: vector trong c++

Nhưng nói đến việc STL thì được xem là bài bác tập luyện đặc biệt lâu năm nên ngày hôm nay bản thân tiếp tục chỉ nói đến vector thôi.

Vậy Vector vô C++ là gì?

Không tương tự như array (mảng), chỉ một số trong những độ quý hiếm chắc chắn rất có thể được tàng trữ bên dưới một thương hiệu biến đổi độc nhất. Vector vô C++ như là dynamic array (mảng động) tuy nhiên sở hữu kĩ năng tự động hóa thay cho thay đổi độ cao thấp Lúc một thành phần được chèn hoặc xóa tùy nằm trong vô nhu yếu của tác vụ được thực đua, với việc tàng trữ của bọn chúng sẽ tiến hành vùng chứa chấp tự động hóa xử lý. Các thành phần vector được đặt điều vô contiguous storage (bộ lưu giữ ngay lập tức kề) nhằm bọn chúng rất có thể được truy vấn và duyệt qua quýt bằng phương pháp dùng iterator.

vector-trong-c++

Vì sao nên sử dụng Vector

Nếu chúng ta vẫn phân phát ngán việc quản lý và vận hành mảng động qua quýt con cái trỏ vô C++ hoặc ngán nên tạo nên mảng mới nhất, copy những thành phần qua quýt mảng mới nhất, rồi lại xóa mảng cũ mỗi một khi mình muốn resize độ cao thấp mảng động vô C++. Thật quá thải, tốn thời hạn và này đó là thời gian tao xem sét C++ còn tồn tại vector.

Một số điểm nổi trội của Vector

– quý khách không nhất thiết phải khai báo độ cao thấp của mảng ví dụ int A[100]…, vì như thế vector rất có thể tự động hóa nâng độ cao thấp lên.

– Nếu chúng ta thêm thắt một phần tử vô vector vẫn giàn giụa rồi, thì nó sẽ bị tự động hóa tăng độ cao thấp của chính nó lên nhằm dành riêng khu vực mang lại độ quý hiếm mới mẻ này.

– Vector còn hỗ trợ cho mình biết con số những thành phần tuy nhiên chúng ta đang được lưu vô cơ.

– Dùng số thành phần âm vẫn được vô vector ví dụ A[-6], A[-9], đặc biệt tiện trong các việc setup những giải thuật.

Giới thiệu literals và operators”]

Vector sở hữu trật tự vô C++ không?

Không sở hữu vector này ko được bố trí vô C++. Các thành phần vector được đặt điều vô bộ lưu trữ ngay lập tức kề nhằm bọn chúng rất có thể được truy vấn và dịch chuyển qua quýt những iterator. Trong vector, tài liệu được chèn vào thời gian cuối. Việc chèn một thành phần vào thời gian cuối tiếp tục rơi rụng thời hạn chênh chênh chếch, vì như thế nhiều lúc rất có thể cần thiết không ngừng mở rộng vector. Việc xóa thành phần sau cùng chỉ rơi rụng thời hạn ko thay đổi vì như thế ko xẩy ra thay cho thay đổi độ cao thấp. Chèn và xóa ở đầu hoặc thân thiết vector là tuyến tính theo dõi thời hạn.

Các vector được tàng trữ vô C++ như vậy nào?

Để tạo nên một vector, bạn phải tiến hành theo dõi cú pháp bên dưới đây:

Cú pháp:

#include <vector>
//...
vector<object_type> variable_name;

Ví dụ:

#include <vector>
int main()
{
    std::vector<int> my_vector;
}

Vậy là tất cả chúng ta vẫn sở hữu một vector với từng thành phần sở hữu loại tài liệu (object_type) là int. Sau cơ chúng ta có thể gắn độ quý hiếm mang lại vector như này:

vector<int> my_vector = {1,2,3,4,5}

Hoặc chúng ta cũng rất có thể tạo nên một vector rồi gán độ quý hiếm của một vector không giống mang lại nó bởi vì cách:

vector<int> my_vector = {1,2,3,4,5};
vector<int> your_vector = my_vector;

Cơ chế ngăn ngừa nhỉ bộ lưu trữ của Vector

Khi một biến vector rời ngoài phạm vi đoạn code tuy nhiên lịch trình đang làm việc, nó sẽ bị tự động hóa giải tỏa những phần bộ lưu trữ tuy nhiên nó trấn áp (nếu cần). Như vậy không chỉ có tiện nghi (vì chúng ta ko cần thiết tự động tay giải tỏa cỗ nhớ), tuy nhiên nó còn hỗ trợ phòng tránh lỗi nhỉ bộ lưu trữ (memory leaks).

Xem hàm bên dưới đây:

void doSomething(bool earlyExit)
{
	int *array = new int[3]{ 1, 3, 2 };

	if (earlyExit) 
		return;

	delete[] array; 
}

Nếu biến earlyExit được gán là true, mảng array sẽ ko lúc nào được giải tỏa, và bộ lưu trữ có khả năng sẽ bị nhỉ.

Tuy nhiên, nếu như biến array là một vector, điều này sẽ không còn xẩy ra, chính vì bộ lưu trữ sẽ tiến hành giải tỏa ngay lập tức sau thời điểm biến array ở ngoài phạm vi đoạn code tuy nhiên lịch trình đang làm việc (bất kể hàm sở hữu bị bay rời khỏi sớm hoặc không). Như vậy thực hiện mang lại vector đáng tin cậy rất nhiều đối với việc chúng ta nên tự động lưu ý cho tới việc giải tỏa bộ lưu trữ.

Vector tự động ghi lưu giữ chừng lâu năm của mình

Không tương tự như mảng động được tích hợp ý sẵn của C++, khuôn mẫu tuy nhiên ko hiểu rằng chừng lâu năm của mảng tuy nhiên nó đang được trỏ cho tới là từng nào, std::vectors tự theo dõi dõi chừng lâu năm của nó. Chúng tao rất có thể lấy được chừng lâu năm của vector trải qua hàm size():

#include <iostream>
#include <vector>

void printLength(const std::vector<int>& array)
{
    std::cout << "The length is: " << array.size() << 'n';
}

int main()
{
    std::vector array { 9, 7, 5, 3, 1 };
    printLength(array);

    return 0;
}

Output:

The length is: 5

Tương tự động với array, hàm size() tiếp tục trả về một độ quý hiếm nằm trong loại nested type (kiểu tài liệu lồng) là size_type, nó là một số trong những vẹn toàn ko vết.

Các hàm của Vectors vô C ++

Vector vô STL hỗ trợ mang lại tất cả chúng ta nhiều tính năng hữu ích không giống nhau.

1. Modifiers
2. Iterators
3. Capacity
4. Element access

Modifiers

1. push_back(): Hàm đẩy một thành phần vô địa điểm sau nằm trong của vector. Nếu loại của đối tượng người tiêu dùng được truyền bên dưới dạng thông số vô push_back() rất khác với loại của vector thì có khả năng sẽ bị ném rời khỏi.

ten-vector.push_back(ten-cua-phan-tu);

2. assign(): Nó gán một độ quý hiếm mới nhất cho những thành phần vector bằng phương pháp thay cho thế những độ quý hiếm cũ.

ten-vector.assign(int size, int value);

3. pop_back(): Hàm pop_back () được dùng nhằm xóa chuồn thành phần sau cùng một vector.

ten-vector.pop_back();

4. insert(): Hàm này chèn những thành phần mới nhất vô trước thành phần trước địa điểm được trỏ bởi vì vòng lặp. Chúng tao cũng rất có thể gửi một số trong những đối số loại phụ thân, kiểm điểm số thứ tự thành phần được chèn vô trước địa điểm được trỏ.

ten-vector.insert(position, value);

5. erase(): Hàm được dùng nhằm xóa những thành phần tùy từng địa điểm vùng chứa

ten-vector.erase(position);

ten-vector.erase(start-position, end-position);

6. emplace(): Nó không ngừng mở rộng vùng chứa chấp bằng phương pháp chèn thành phần mới nhất vào

Xem thêm: số 0 có phải là số nguyên không

ten-vector.emplace(ten-vector.position, element);

7. emplace_back(): Nó được dùng nhằm chèn một thành phần mới nhất vô vùng chứa chấp vector, thành phần mới nhất sẽ tiến hành thêm thắt vào thời gian cuối vector

ten-vector.emplace_back(value);

8. swap(): Hàm được dùng nhằm hoán thay đổi nội dung của một vector này với 1 vector không giống nằm trong loại. Kích thước rất có thể không giống nhau.

ten-vector-1.swap(ten-vector-2);

9. clear(): Hàm được dùng nhằm vô hiệu hóa toàn bộ những thành phần của vùng chứa chấp vector.

ten-vector.clear();

Ví dụ:

/ Modifiers in vector 
#include <bits/stdc++.h> 
#include <vector> 
using namespace std; 
   
int main() 
{ 
    // Assign vector 
    vector<int> vec; 
   
    // fill the array with 12 seven times 
    vec.assign(7, 12); 
   
    cout << "The vector elements are: "; 
    for (int i = 0; i < 7; i++) 
        cout << vec[i] << " "; 
   
    // inserts 24 vĩ đại the last position 
    vec.push_back(24); 
    int s = vec.size(); 
    cout << "nThe last element is: " << vec[s - 1]; 
 
     // prints the vector 
    cout << "nThe vector elements after push back are: "; 
    for (int i = 0; i < vec.size(); i++) 
    cout << vec[i] << " "; 
   
    // removes last element 
    vec.pop_back(); 
   
    // prints the vector 
    cout << "nThe vector elements after pop_back are: "; 
    for (int i = 0; i < vec.size(); i++) 
        cout << vec[i] << " "; 
   
    // inserts 10 at the beginning 
    vec.insert(vec.begin(), 10); 
   
    cout << "nThe first element after insert command is: " << vec[0]; 
   
    // removes the first element 
    vec.erase(vec.begin()); 
   
    cout << "nThe first element after erase command is: " << vec[0]; 
   
    // inserts at the beginning 
    vec.emplace(vec.begin(), 5); 
    cout << "nThe first element emplace is: " << vec[0]; 
   
    // Inserts đôi mươi at the kết thúc 
    vec.emplace_back(20); 
    s = vec.size(); 
    cout << "nThe last element after emplace_back is: " << vec[s - 1]; 
   
    // erases the vector 
    vec.clear(); 
    cout << "nVector size after clear(): " << vec.size(); 
   
    // two vector vĩ đại perform swap 
    vector<int> obj1, obj2; 
    obj1.push_back(2); 
    obj1.push_back(4); 
    obj2.push_back(6); 
    obj2.push_back(8); 
   
    cout << "nnVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
   
    // Swaps obj1 and obj2 
    obj1.swap(obj2); 
   
    cout << "nAfter Swap nVector 1: "; 
    for (int i = 0; i < obj1.size(); i++) 
        cout << obj1[i] << " "; 
   
    cout << "nVector 2: "; 
    for (int i = 0; i < obj2.size(); i++) 
        cout << obj2[i] << " "; 
}

Output:

vector-trong-c++

Bạn rất có thể thấy cơ hội dùng những hàm nằm trong group Modifiers tuy nhiên tất cả chúng ta vẫn nghiên cứu và phân tích phía trên qua quýt ví dụ thực dìu.

Iterators

  1. begin(): đặt điều iterator cho tới thành phần trước tiên vô vectorten-vector.begin();
  2. end(): đặt điều iterator cho tới sau thành phần sau cùng vô vectorten-vector.end();
  3. rbegin(): đặt điều reverse iterator (trình lặp đảo) cho tới thành phần sau cùng vô vector (reverse begin). Nó dịch chuyển kể từ thành phần sau cùng cho tới thành phần đầu tiên

    ten-vector.rbegin();

  4. rend(): đặt điều reverse iterator (trình lặp đảo) cho tới thành phần trước tiên vô vector (reverse end)

    ten-vector.rend();

  5. cbegin(): đặt điều constant iterator (trình vòng lặp) cho tới thành phần trước tiên vô vectorten-vector.cbegin();
  6. cend(): đặt điều constant iterator (trình vòng lặp) cho tới thành phần sau cùng vô vectorten-vector.cend();
  7. crbegin(): đặt constant reverse iterator (trình lặp hòn đảo liên tục) cho tới thành phần sau cùng vô vector (reverse begin). Nó dịch chuyển kể từ thành phần sau cùng cho tới thành phần đầu tiênten-vector.cbregin();
  8. crend(): đặt điều constant reverse iterator (trình lặp hòn đảo liên tục) cho tới thành phần trước tiên vô vector (reverse end)ten-vector.crend();

Ví dụ 1:

#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Understanding begin() and end() function: " << endl; 
    for (auto i = vec1.begin(); i != vec1.end(); ++i) 
        cout << *i << " "; 
 
    return 0; 
}

Output:

vector-trong-c++

Trong ví dụ bên trên, tất cả chúng ta rất có thể thấy cơ hội dùng hàm begin() và end(). trước hết, tất cả chúng ta xác lập một vector là vec1, bọn chúng đẩy lùi những độ quý hiếm vô cơ từ là một cho tới 10 bằng phương pháp dùng vòng lặp for. Sau cơ, bọn chúng in những độ quý hiếm của những vector của Cửa Hàng chúng tôi bằng phương pháp dùng vòng lặp for, Cửa Hàng chúng tôi dùng hàm begin() và end() nhằm chỉ định và hướng dẫn điểm đầu và điểm cuối của vòng lặp for của Cửa Hàng chúng tôi.

Ví dụ 2:

// C++ program vĩ đại illustrate the 
// iterators in vector 
#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int> g1; 

    for (int i = 1; i <= 5; i++) 
        g1.push_back(i); 

    cout << "Output of begin and end: "; 
    for (auto i = g1.begin(); i != g1.end(); ++i) 
        cout << *i << " "; 

    cout << "nOutput of cbegin and cend: "; 
    for (auto i = g1.cbegin(); i != g1.cend(); ++i) 
        cout << *i << " "; 

    cout << "nOutput of rbegin and rend: "; 
    for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir) 
        cout << *ir << " "; 

    cout << "nOutput of crbegin and crend : "; 
    for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir) 
        cout << *ir << " "; 

    return 0; 
}

Output:

vector-trong-c++

Ví dụ 3:

// CPP program vĩ đại illustrate working of crbegin()  
// crend() 
#include <iostream> 
#include <vector> 
using namespace std; 

int main () 
{ 
  // initializing vector with values 
  vector<int> vect = {10, đôi mươi, 30, 40, 50}; 

  // for loop with crbegin and crend 
  for (auto i = vect.crbegin(); i != vect.crend(); i++) 
    cout << ' ' << *i;  //printing results 

  cout << 'n'; 
  return 0; 
}

Output:

50 40 30 đôi mươi 10

Capacity

  1. size(): hàm tiếp tục trả về con số thành phần đang rất được dùng vô vectorten-vector.size();
  2. max_size(): hàm trả về số thành phần tối nhiều tuy nhiên vector rất có thể chứaten-vector.max_size();
  3. capacity(): hàm trả về số thành phần được cấp phép mang lại vector nằm trong cỗ nhớten-vector.capacity();
  4. resize(n): Hàm này thay cho thay đổi độ cao thấp vùng chứa chấp nhằm nó chứa chấp đầy đủ n thành phần. Nếu độ cao thấp lúc này của vector to hơn n thì những thành phần đàng sau có khả năng sẽ bị xóa ngoài vector và ngược lại nếu như độ cao thấp lúc này nhỏ rộng lớn n thì những thành phần bổ sung cập nhật sẽ tiến hành chèn vô đàng sau vectorten-vector.resize(int n, int value);
  5. empty(): Trả về liệu vùng chứa chấp sở hữu trống không hay là không, nếu như trống không thì trả về True, nếu như sở hữu thành phần thì trả về Falseten-vector.empty();
  6. shrink_to_fit(): Giảm dung tích của vùng chứa chấp nhằm phù phù hợp với độ cao thấp của chính nó và diệt toàn bộ những thành phần vượt lên trước quá dung lượngten-vector.shrink_to_fit();
  7. reserve(n): hàm cấp cho mang lại vector số dung tích một vừa hai phải đầy đủ nhằm chứa chấp n phần tửten-vector.reserve(n);

Ví dụ:

#include <iostream> 
#include <vector> 
   
using namespace std; 
   
int main() 
{ 
    vector<int> vec1; 
   
    for (int i = 1; i <= 10; i++) 
        vec1.push_back(i); 
   
    cout << "Size of our vector: " << vec1.size(); 
    cout << "nCapacity of our vector: " << vec1.capacity(); 
    cout << "nMax_Size of our vector: " << vec1.max_size(); 
   
    // resizes the vector size vĩ đại 4 
    vec1.resize(4); 
   
    // prints the vector size after resize() 
    cout << "nSize of our vector after resize: " << vec1.size(); 
   
    // checks if the vector is empty or not 
    if (vec1.empty() == false) 
        cout << "nVector is not empty"; 
    else
        cout << "nVector is empty"; 
   
    return 0; 
}

Output:

capacity-vectors-in-c++

Chú ý: Khi thay cho thay đổi độ cao thấp mảng vector, những độ quý hiếm của thành phần hiện tại sở hữu cần thiết không thay đổi, thì những thành phần vừa mới được khởi tạo nên bởi vì độ quý hiếm đem tấp tểnh của loại tài liệu mảng.

Chúng tao rất có thể thấy cơ hội hoạt động và sinh hoạt của những hàm capacity như vẫn thảo luận phía trên.

Element access

  1. at(g): Trả về một tham lam chiếu cho tới thành phần ở địa điểm ‘g’ vô vectorten-vector.at(position);
  2. data(): Trả về một con cái trỏ thẳng cho tới (memory array) bộ lưu trữ mảng được vector dùng phía bên trong nhằm tàng trữ những thành phần thuộc về của nóten-vector.data();
  3. front(): hàm dùng làm mang ra thành phần trước tiên của vectorten-vector.front();
  4. back(): hàm dùng làm mang ra thành phần sau cùng của vectorten-vector.back();

Ví dụ: 

// C++ program vĩ đại illustrate the 
// element accesser in vector 
#include <bits/stdc++.h> 
using namespace std; 
  
int main() 
{ 
    vector<int> g1; 
  
    for (int i = 1; i <= 10; i++) 
        g1.push_back(i * 10); 
  
    cout << "nReference operator [g] : g1[2] = " << g1[2]; 
  
    cout << "nat : g1.at(4) = " << g1.at(4); 
  
    cout << "nfront() : g1.front() = " << g1.front(); 
  
    cout << "nback() : g1.back() = " << g1.back(); 
  
    // pointer vĩ đại the first element 
    int* pos = g1.data(); 
  
    cout << "nThe first element is " << *pos; 
    return 0; 
}

Output:

vector-trong-c++

Thực hiện tại nén nhiều độ quý hiếm bools

Vector còn tồn tại một thủ pháp hoặc ho không giống là dùng một setup đặc biệt quan trọng giành riêng cho vector loại bool tuy nhiên nó rất có thể nén 8 độ quý hiếm booleans vô vào có một byte (amazing!!) Quá trình này và đã được thiết lập sẵn, toàn bộ những gì bạn phải đơn giản dùng nó như 1 tác dụng tương hỗ Lúc lập trình sẵn. Thủ thuật này cũng sẽ không còn tác động gì cho tới cơ hội tuy nhiên chúng ta dùng vector.

#include <vector>
#include <iostream>

int main()
{
    std::vector<bool> array { true, false, false, true, true };
    std::cout << "The length is: " << array.size() << 'n';

    for (int i : array)
        std::cout << i << ' ';

    std::cout << 'n';

    return 0;
}

Output:

The length is: 5
1 0 0 1 1

Kết

Với những cú pháp khuôn mẫu và ví dụ thực dìu bên trên, tất cả chúng ta kết thúc giục phần lần hiểu về vector vô C++. Tôi kỳ vọng chúng ta vẫn phân biệt được những hàm không giống nhau của vector và tóm được cơ hội hoạt động và sinh hoạt của từng hàm. Vì vector tương hỗ rất hay trong các việc thao tác với mảng động, đáp ứng đáng tin cậy và dễ dàng và đơn giản rộng lớn. quý khách nên dùng vector vô đa số những tình huống đụng chạm cho tới mảng động.

Nguồn kỹ năng về vector chúng ta nên tham lam khảo:

Xem thêm: công thức tính diện tích hình tam giác vuông

  • GeeksforGeeks
  • Cplusplus

Có thể mình muốn coi thêm:

  • [Tự học tập C++] Giới thiệu về phạm vi(scope) của biến đổi hoặc hàm viên bộ
  • Tất tần tật về C và C++
  • Tài liệu lập trình sẵn C/C++ và công việc tự động học tập lập trình

Xem thêm việc thực hiện C++ Developer tại TopDev