Итерация по множеству std :: vector - PullRequest
10 голосов
/ 04 февраля 2010

Я читал здесь и в других местах, что при итерации 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?

Спасибо.

Ответы [ 5 ]

7 голосов
/ 04 февраля 2010

Да, практически для любых практических целей вы можете просто использовать 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 голосов
/ 04 февраля 2010

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

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

2 голосов
/ 04 февраля 2010

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

1 голос
/ 04 февраля 2010

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

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

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

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

0 голосов
/ 04 февраля 2010

Вы должны использовать итераторы вместо

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...