Предлагаемое векторное решение копирует массив (только указатели, но не строки 1 - но все же).Unnessary.Решение argv_range - это то, что я бы тоже попробовал, если бы я абсолютно хотел использовать цикл на основе диапазона.Но это приводит к большому количеству дополнительного кода (допускается только один раз, если вы записываете его в заголовочный файл и сохраняете его, но все же).
Классический цикл кажется мне настолько простым, что я позволяю себе простопубликовать его, я не считаю, что стоить таких усилий, просто иметь цикл на основе диапазона ...
for (char** a = argv; *a; ++a)
{
// use *a, or if you don't like:
char* arg = *a;
// use arg...
}
Или, если вам больше не понадобится массив argv впоследствии:
for (++argv; *argv; ++argv)
{
// use *argv, or if you don't like:
char* a = *argv;
// use a...
}
Существует небольшая разница, которую вы могли заметить: в первом варианте я перебираю все значения, во втором я пропускаю первое (обычно это имя программы, которую мыне заинтересованы во многих случаях).И наоборот, для каждого:
for (char** a = argv + 1; *a; ++a);
for (; *argv; ++argv);
1 Это применимо только при использовании std::vector<char*>
;при использовании std::vector<std::string>
, как на самом деле предлагается, копируются даже сами строки!