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