Я читал здесь и другие места что при итерации станд.:: вектор с помощью индексирует Вас, должен:
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
?
Был бы это быть безопасным только использовать станд.:: size_t?
Спасибо.
Да, практически для любых практических целей вы можете просто использовать 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));
В целом стандарт C ++ не дает таких гарантий: ни равенство size_types для разно параметризованных контейнеров, ни равенство size_t.
Вы должны использовать iterators вместо этого
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 был бы тем же внутренним типом, так или иначе, для станд.:: вектор
вы могли повторить использование неподписанный интервал
Что ж, я думаю, что:
for (std::vector<int>::size_type i = 0; i < x.size(); i++){
- это своего рода совет совершенства - ожидаете ли вы, что ваши векторы будут быть действительно гигантским? Лично я использую unsigned int
без проблем.
А теперь, полагаю, начнутся голоса против ...
Думаю, вы можете с уверенностью предположить, что size_type
является неотрицательным целым числом без знака. На большее нельзя полагаться. Конечно, у большинства контейнеров есть size_type
, который совпадает с size_t
, но нет никаких гарантий.
Документация SGI и этот источник http://www.cplusplus.com/reference/stl/vector/ , похоже, согласны с этим.
Вы также можете взглянуть на это решение своей проблемы: http://rosettacode.org/wiki/Loop_over_multiple_arrays_simhibitedly#C.2B.2B
Надеюсь, это поможет.