Iterate Multiple std::vector

Я читал здесь и в других местах, что при повторении использования std::vector с использованием индексов вам следует:

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

Но что, если вы повторяете два вектора разных типов:

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;
}

Можно ли предположить, что

std::vector<int>::size_type

имеет тот же тип, что и

std::vector<double>::size_type

?

Можно ли просто использовать std:: size_t?

Спасибо.

Ответ 1

Да, практически для любой практической цели вы можете просто использовать std:: size_t. Хотя было (вроде) намерение, что разные контейнеры могут использовать разные типы для своих размеров, он по-прежнему в основном гарантирует, что (по крайней мере для стандартных контейнеров) size_type совпадает с size_t.

В качестве альтернативы вы можете использовать алгоритм, например:

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));

Ответ 2

В общем, стандарт С++ не дает таких гарантий: ни равенство size_types для контейнеров с различной параметризацией, ни равенство size_t.

Ответ 3

Я думаю, вы можете с уверенностью предположить, что size_type - это нецелевое целое число без знака. Вы не можете больше полагаться на это. Конечно, в большинстве контейнеров есть size_type, который совпадает с size_t, но никаких гарантий нет.

Документация SGI и этот источник http://www.cplusplus.com/reference/stl/vector/, похоже, согласны с этой точкой.

Вы также можете взглянуть на это решение для своей проблемы: http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#C.2B.2B

Надеюсь, это поможет.

Ответ 4

Ну, я думаю, что:

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

является чем-то вроде совета совершенства - вы ожидаете, что ваши векторы будут действительно гигантскими? Лично я использую unsigned int, с нулевыми проблемами.

И теперь я полагаю, что downvotes начнутся...

Ответ 5

Вместо этого следует использовать итераторы

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;
}

Потому что нет гарантии, что u size_type будет одним и тем же внутренним типом, во всяком случае, для std::vector вы можете выполнять итерацию с помощью unsigned int