tags:

views:

210

answers:

5

I've read here and other places that when iterating a std::vector using indexes you should:

std::vector <int> x(20,1);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
  x[i]+=3;
}

But what if you are iterating two vectors of different types:

std::vector <int> x(20,1);
std::vector <double> y(20,1.0);
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
  x[i]+=3;
  y[i]+=3.0;
}

Is it safe to assume that

std::vector<int>::size_type

is of the same type as

std::vector<double>::size_type

?

Would it be safe just to use std::size_t?

Thanks.

+2  A: 

In general, C++ standard doesn't give such guarantees: neither equality of size_types for differently parametrized containers, nor equality to size_t.

Alexander Poluektov
+1. And you were correct, the `std::size_t` guarantee is for allocators only. I thought `std::vector::size_type` had to be equal to `Allocator::size_type`, but apparently not.
avakar
@avakar:The situation is that the standard allocator uses size_t for its size_type, and all known implementations of the standard containers pass the size_type through from their associated allocator. As a result, unless you write your own allocator, it's going to be size_t. From a practical perspective, size_t is essentially always going to work, regardless of what they use as size_type -- e.g. `::operator new` uses size_t for the size of allocation, and essentially all other allocation goes through that (at least by default).
Jerry Coffin
+5  A: 

Yes, for almost any practical purpose, you can just use std::size_t. Though there was (sort of) an intent that different containers could use different types for their sizes, it's still basically guaranteed that (at least for standard containers) size_type is the same as size_t.

Alternatively, you could consider using an algorithm, something like:

std::transform(x.begin(), x.end(), x.begin(), std::bind2nd(std::plus<int>(), 3));
std::transform(y.begin(), y.end(), y.begin(), std::bind2nd(std::plus<double>(), 3.0));
Jerry Coffin
+1  A: 

Well, I think that:

 for (std::vector<int>::size_type i = 0; i < x.size(); i++){

is something of a council of perfection - are you expecting your vectors to be really gigantic? Personally, I use unsigned int, with zero problems.

And now I suppose the downvotes will begin...

anon
@Neil, love the "council of perfection". I was using unsigned int but reading stuff like this: http://stackoverflow.com/questions/409348/iteration-over-vector-in-c, makes we worry. Probably un-needed worry.
Mark
@Neil: you'll never live that long -- nobody want to be blamed perfectionist I guess :-D
Alexander Poluektov
@Mark If you are using an unsigned type, you are OK, IMHO. litb's answer to the question you linked is (of course) correct, but you have really got to love typing (in both senses) to use size_type.
anon
+1  A: 

I think you can safely assume that size_type is an unsigned nonegative integer. You can't rely on much beyond that. Sure, most containers have a size_type which is the same as size_t but there are no guarantees.

The SGI documentation and this source http://www.cplusplus.com/reference/stl/vector/ seem to agree on the point.

You may also want to take a look to this solution for your problem: http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#C.2B.2B

I hope this helps.

batbrat
@batbrat, nice link to rosettacode, very helpful.
Mark
Glad it helped!
batbrat
A: 

You should use iterators instead

std::vector <int> x(20,1);
std::vector <double> y(20,1.0);
std::vector<double>::iterator j = y.begin();
for (std::vector<int>::iterator i = x.begin(); i != x.end(); ++i){
  *i +=3;
  *j +=3.0;
  ++j;
}

Cause there's no guarantee that u size_type would be the same internal type, anyway, for std::vector you could iterate using unsigned int

erick2red
Why not incrementing `j` in the for control body ? And you too suffer from not using a `max` or `end` variable to check the end of the iteration... stick with `for_each` really ;)
Matthieu M.
@MatthieuM, how could you use foreach when you need to iterate across two different vectors? Obviously this example is trite and the loops can be separated, I can't think of a way to do it for x[i] = y[i] + 3
Jamie Cook