Advantages of vector over array in C++ - GeeksforGeeks

30 Oct, 2018
We have already discussed arrays and vectors. In this post, we will discuss advantages of vector over normal array.
Advantages of Vector over arrays :
Vector is template class and is C++ only construct whereas arrays are built-in language construct and present in both C and C++.Vector are implemented as dynamic arrays with list interface whereas arrays can be implemented as statically or dynamically with primitive data type interface.#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation    int* arr = new int[100]; // Dynamic Implementation    vector<int> v; // Vector's Implementation    return 0;}Size of arrays are fixed whereas the vectors are resizable i.e they can grow and shrink as vectors are allocated on heap memory.#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation      cout << "Size of Array " << sizeof(array) / sizeof(array[0]) << "\n";      vector<int> v; // Vector's Implementation      // Inserting Values in Vector    v.push_back(1);    v.push_back(2);    v.push_back(3);    v.push_back(4);    v.push_back(5);      cout << "Size of vector Before Removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      v.erase(v.begin() + 2); // Remove 3rd element      cout << "\nSize of vector After removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      return 0;}Output:Size of Array 100
Size of vector Before Removal=5
1 2 3 4 5 
Size of vector After removal=4
1 2 4 5
Arrays have to be deallocated explicitly if defined dynamically whereas vectors are automatically de-allocated from heap memory.#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation    delete[] arr; // array Explicitly deallocated      vector<int> v; // Automatic deallocation when variable goes out of scope    return 0;}Size of array cannot be determined if dynamically allocated whereas Size of the vector can be determined in O(1) time.When arrays are passed to a function, a separate parameter for size is also passed whereas in case of passing a vector to a function, there is no such need as vector maintains variables which keeps track of size of container at all times.#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation      cout << "Size of array= ";    cout << sizeof(arr) / sizeof(*arr) << "\n"; // Pointer cannot be used to get size of    // block pointed by it    return 0;}Output:Size of array= 2
When array becomes full and new elements are inserted; no reallocation is done implicitly whereas When vector becomes larger than its capacity, reallocation is done implicitly.Arrays cannot be returned unless dynamically allocated from a function whereas vectors can be returned from a function.// Program to demonstrate arrays cannot be returned#include <bits/stdc++.h>using namespace std;  int* getValues(){      int arr[10]; // Array defined locally    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      return arr; // returning pointer to array}  // main functionint main(){      int* array; // pointer of int type      array = getValues(); // Call function to get arr      for (int i = 0; i < 10; i++) { // Printing Values        cout << "*(array + " << i << ") : ";        cout << *(array + i) << endl;    }      return 0;}Output:warning: address of local variable 'arr' returned [-Wreturn-local-addr]
Segmentation Fault (SIGSEGV)
// Program to demonstrate vector can be returned#include <bits/stdc++.h>using namespace std;  // Function returning vectorvector<int> getValues(){      vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++) // Inserting values in Vector        v.push_back(i + 1);      return v; // returning pointer to array}  // main functionint main(){      vector<int> get;      get = getValues(); // Call function to get v      // Output Values of vector    for (auto it : get)        cout << it << " ";      return 0;}Output:1 2 3 4 5 6 7 8 9 10 
Arrays cannot be copied or assigned directly whereas Vectors can be copied or assigned directly.#include <bits/stdc++.h>using namespace std;  // main functionint main(){    vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++)        v.push_back(i + 1);      vector<int> get;      get = v; // Copying vector v into vector get      cout << "vector get:\n";    for (auto it : get)        cout << it << " ";      int arr[10];    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      int copyArr[10];      copyArr = arr; // Error      return 0;}Output:vector get:
1 2 3 4 5 6 7 8 9 10

error: invalid array assignment
    copyArr=arr;

Vector is template class and is C++ only construct whereas arrays are built-in language construct and present in both C and C++.
Vector are implemented as dynamic arrays with list interface whereas arrays can be implemented as statically or dynamically with primitive data type interface.#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation    int* arr = new int[100]; // Dynamic Implementation    vector<int> v; // Vector's Implementation    return 0;}
#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation    int* arr = new int[100]; // Dynamic Implementation    vector<int> v; // Vector's Implementation    return 0;}
Size of arrays are fixed whereas the vectors are resizable i.e they can grow and shrink as vectors are allocated on heap memory.#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation      cout << "Size of Array " << sizeof(array) / sizeof(array[0]) << "\n";      vector<int> v; // Vector's Implementation      // Inserting Values in Vector    v.push_back(1);    v.push_back(2);    v.push_back(3);    v.push_back(4);    v.push_back(5);      cout << "Size of vector Before Removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      v.erase(v.begin() + 2); // Remove 3rd element      cout << "\nSize of vector After removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      return 0;}Output:Size of Array 100
Size of vector Before Removal=5
1 2 3 4 5 
Size of vector After removal=4
1 2 4 5

#include <bits/stdc++.h>using namespace std;  int main(){    int array[100]; // Static Implementation      cout << "Size of Array " << sizeof(array) / sizeof(array[0]) << "\n";      vector<int> v; // Vector's Implementation      // Inserting Values in Vector    v.push_back(1);    v.push_back(2);    v.push_back(3);    v.push_back(4);    v.push_back(5);      cout << "Size of vector Before Removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      v.erase(v.begin() + 2); // Remove 3rd element      cout << "\nSize of vector After removal=" << v.size() << "\n";      // Output Values of vector    for (auto it : v)        cout << it << " ";      return 0;}
Output:
Size of Array 100
Size of vector Before Removal=5
1 2 3 4 5 
Size of vector After removal=4
1 2 4 5

Arrays have to be deallocated explicitly if defined dynamically whereas vectors are automatically de-allocated from heap memory.#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation    delete[] arr; // array Explicitly deallocated      vector<int> v; // Automatic deallocation when variable goes out of scope    return 0;}
#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation    delete[] arr; // array Explicitly deallocated      vector<int> v; // Automatic deallocation when variable goes out of scope    return 0;}
Size of array cannot be determined if dynamically allocated whereas Size of the vector can be determined in O(1) time.
When arrays are passed to a function, a separate parameter for size is also passed whereas in case of passing a vector to a function, there is no such need as vector maintains variables which keeps track of size of container at all times.#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation      cout << "Size of array= ";    cout << sizeof(arr) / sizeof(*arr) << "\n"; // Pointer cannot be used to get size of    // block pointed by it    return 0;}Output:Size of array= 2

#include <bits/stdc++.h>using namespace std;  int main(){    int* arr = new int[100]; // Dynamic Implementation      cout << "Size of array= ";    cout << sizeof(arr) / sizeof(*arr) << "\n"; // Pointer cannot be used to get size of    // block pointed by it    return 0;}
Output:
Size of array= 2

When array becomes full and new elements are inserted; no reallocation is done implicitly whereas When vector becomes larger than its capacity, reallocation is done implicitly.
Arrays cannot be returned unless dynamically allocated from a function whereas vectors can be returned from a function.// Program to demonstrate arrays cannot be returned#include <bits/stdc++.h>using namespace std;  int* getValues(){      int arr[10]; // Array defined locally    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      return arr; // returning pointer to array}  // main functionint main(){      int* array; // pointer of int type      array = getValues(); // Call function to get arr      for (int i = 0; i < 10; i++) { // Printing Values        cout << "*(array + " << i << ") : ";        cout << *(array + i) << endl;    }      return 0;}Output:warning: address of local variable 'arr' returned [-Wreturn-local-addr]
Segmentation Fault (SIGSEGV)
// Program to demonstrate vector can be returned#include <bits/stdc++.h>using namespace std;  // Function returning vectorvector<int> getValues(){      vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++) // Inserting values in Vector        v.push_back(i + 1);      return v; // returning pointer to array}  // main functionint main(){      vector<int> get;      get = getValues(); // Call function to get v      // Output Values of vector    for (auto it : get)        cout << it << " ";      return 0;}Output:1 2 3 4 5 6 7 8 9 10 

// Program to demonstrate arrays cannot be returned#include <bits/stdc++.h>using namespace std;  int* getValues(){      int arr[10]; // Array defined locally    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      return arr; // returning pointer to array}  // main functionint main(){      int* array; // pointer of int type      array = getValues(); // Call function to get arr      for (int i = 0; i < 10; i++) { // Printing Values        cout << "*(array + " << i << ") : ";        cout << *(array + i) << endl;    }      return 0;}
Output:
warning: address of local variable 'arr' returned [-Wreturn-local-addr]
Segmentation Fault (SIGSEGV)

// Program to demonstrate vector can be returned#include <bits/stdc++.h>using namespace std;  // Function returning vectorvector<int> getValues(){      vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++) // Inserting values in Vector        v.push_back(i + 1);      return v; // returning pointer to array}  // main functionint main(){      vector<int> get;      get = getValues(); // Call function to get v      // Output Values of vector    for (auto it : get)        cout << it << " ";      return 0;}
Output:
1 2 3 4 5 6 7 8 9 10 

Arrays cannot be copied or assigned directly whereas Vectors can be copied or assigned directly.#include <bits/stdc++.h>using namespace std;  // main functionint main(){    vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++)        v.push_back(i + 1);      vector<int> get;      get = v; // Copying vector v into vector get      cout << "vector get:\n";    for (auto it : get)        cout << it << " ";      int arr[10];    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      int copyArr[10];      copyArr = arr; // Error      return 0;}Output:vector get:
1 2 3 4 5 6 7 8 9 10

error: invalid array assignment
    copyArr=arr;

#include <bits/stdc++.h>using namespace std;  // main functionint main(){    vector<int> v; // Vector defined locally    for (int i = 0; i < 10; i++)        v.push_back(i + 1);      vector<int> get;      get = v; // Copying vector v into vector get      cout << "vector get:\n";    for (auto it : get)        cout << it << " ";      int arr[10];    for (int i = 0; i < 10; i++) // Putting Values in array        arr[i] = i + 1;      int copyArr[10];      copyArr = arr; // Error      return 0;}
Output:
vector get:
1 2 3 4 5 6 7 8 9 10

error: invalid array assignment
    copyArr=arr;

nikhil_jsk
cpp-array
cpp-vector
Arrays
Data Structures
Difference Between
Data Structures
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chocolate Distribution Problem
Reversal algorithm for array rotation
Window Sliding Technique
Next Greater Element
Find duplicates in O(n) time and O(1) extra space | Set 1
Difference between Stack and Queue Data Structures
Data Structures | Linked List | Question 5
Data Structures | Tree Traversals | Question 4
What is Competitive Programming and How to Prepare for It?
Data Structures | Linked List | Question 1