anna Sjolvikaz
anna Sjolvikaz

Reputation: 141

Array of int or vector?

i'm trying to store some elements that is going to change every time, but i don't know which

way is better and why. I'm thinking about two ways, 1) declaring array of int and loop or

use vector's.

Which way is better and why?

Does declaring array of int have any future memore problems as leak?

the code down below show the two ways i'm talking about:

1)

#include <iostream>
#include <vector>


int main()
{

     int x[5];

     x[0] = 10;
     x[1] = 20;
     x[2] = 30;
     x[3] = 40;
     x[4] = 50;


for(unsigned int i = 0;i<=sizeof(x[5]); i++)
    {


     std:: cout << "x[" << i << "] = "<< x[i] << std::endl;

}

system("pause");

    return 0;
}

2)

#include <iostream>
#include <vector>


int main()
{

    std::vector<int> x;

    x.push_back(10);
    x.push_back(20);
    x.push_back(30);
    x.push_back(40);
    x.push_back(50);


for(unsigned int i = 0;i<=x.size()-1; i++)
    {


     std:: cout << "x[" << i << "] = "<< x[i] << std::endl;

}

system("pause");

    return 0;
}

Upvotes: 2

Views: 176

Answers (3)

Andy Prowl
Andy Prowl

Reputation: 126432

If this is all you have to do, and your array will always have a size that is known at compile time, then you do not need std::vector.

On the other hand, in C++11 you could use std::array instead of a plain C array (std::array is a zero-overhead, safer and more functional wrapper over a C array):

#include <iostream>
#include <array>

int main()
{
     std::array<int, 5> x = { 10, 20, 30, 40, 50 };
     for (unsigned int i = 0; i < x.size(); i++)
     //                           ^^^^^^^^
     {
         std:: cout << "x[" << i << "] = "<< x[i] << std::endl;
     }
}

Here is a live example. Notice, that std::array offers a size() member function which you may want to use instead of the sizeof operator.

Moreover, since std::array is a standard sequence container, you could iterate through its element this way:

 std::size_t i = 0;
 for (auto e : x)
 {
     std:: cout << "x[" << i++ << "] = "<< e << std::endl; 
 }

Here is a live example.

Upvotes: 8

Pete Becker
Pete Becker

Reputation: 76245

If the size is known at compile time, use std::array. If not, use std::vector. In either case, use iterators to look at the elements:

typedef std::array<int> my_container_type;
typedef my_container::iterator iterator;
my_container_type my_container = { whatever };

for (iterator it = my_container.begin(); it != my_container.end(); ++it)
    std::cout << "x[" << (it - my_container.begin()) << "] = " << *it << '\n';

By using iterators you greatly reduce the risk of accidentally using a loop limit like sizeof(x[5]), which is nonsense.

Upvotes: 5

TheBuzzSaw
TheBuzzSaw

Reputation: 8826

Neither is "better". They both address entirely different use cases.

If you know the array size at compile time and are 100% sure it will never change, sure, use a plain old array. It has less overhead, and the compiler can even aid you with static analysis by spotting any attempts to read outside the boundaries.

On the other hand, if you are unsure of the array's side (i.e. you will be reading input from a file or the user), then use the std::vector. It can grow to any size to meet your needs.

Upvotes: 3

Related Questions