Как всегда, возможностей для этого много. Но чтобы ответить на ваш первоначальный вопрос:
for (std::vector<myClass>::const_iterator i = myVec.begin(); i != myVec.end(); ++i) {
std::cout << *i << ", ";
size_t index = i - myVec.begin();
if (index % 5 == 0) {
std::cout << "\n";
}
}
Это печатает значение в позиции итератора и индекс в векторе. Вы вычисляете разницу между begin()
вектора и текущей позицией итератора, которая является индексом.
Хотя это возможно, я бы не рекомендовал это, потому что у вас есть дополнительное вычитание в каждую итерацию. Как правило, это не та ситуация, когда итераторы очень полезны, как вы сами убедились.
Если у вас есть доступ к достаточно современному компилятору C ++ (который, я думаю, у вас есть), вы можете использовать очень элегантный циклы for на основе диапазона :
for (myClass& obj : myVec) {
std::cout << obj;
}
Это «извлекает» ссылки на объекты в вашем векторе. Конечно, теперь вы еще дальше от позиции индекса, потому что вы не можете использовать трюк с итератором с вычитанием. Чтобы решить вашу проблему с сохранением индекса, вы можете просто сохранить отдельный счетчик индекса:
int i = 0;
for (myClass& obj : myVec) {
std::cout << obj << ", ";
if (i % 5 == 0) {
std::cout << "\n";
}
i++;
}
Или даже использовать совершенно новую функцию C ++ 20 для встроенных инициализированных переменных (я не помню официальную имя для них):
for (int i = 0; myClass& obj : myVec) {
std::cout << obj << ", ";
if (i++ % 5 == 0) {
std::cout << "\n";
}
}
Или вы можете просто использовать классический for (int i = 0; i < size; i++) ...
, хотя это не так ясно, как версия на основе диапазона для-l oop. Используя диапазон для -l oop, можно сразу увидеть, что что-то сделано со всеми объектами в векторе.