Выполните итерации Нескольких станд.:: вектор

Я читал здесь и другие места что при итерации станд.:: вектор с помощью индексирует Вас, должен:

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?

Спасибо.

10
задан lsalamon 4 February 2010 в 15:22
поделиться

5 ответов

Да, практически для любых практических целей вы можете просто использовать 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));
7
ответ дан 4 December 2019 в 01:00
поделиться

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

2
ответ дан 4 December 2019 в 01:00
поделиться

Вы должны использовать 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 был бы тем же внутренним типом, так или иначе, для станд.:: вектор вы могли повторить использование неподписанный интервал

-1
ответ дан 4 December 2019 в 01:00
поделиться

Что ж, я думаю, что:

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

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

А теперь, полагаю, начнутся голоса против ...

1
ответ дан 4 December 2019 в 01:00
поделиться

Думаю, вы можете с уверенностью предположить, что 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

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

2
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: