Самый эффективный способ обработать аргументы от командной строки в C++

Здесь что-то вроде y$ColB[which(x$Col1 == round(median(x$Col1)))] сделало бы свое дело.

Проблема в том, что x имеет четное число строк, поэтому медиана 2.5 не является целым числом. В этом случае вы должны выбрать между 2 или 3.

Примечание. Вышеприведенное работает для вашего примера, а не для общих случаев (например, c(-2L,2L) или с рациональными числами). Для более общего случая см. Решение @ IceCreamToucan.

10
задан Aaron 21 April 2009 в 08:32
поделиться

6 ответов

С C++ ответ обычно находится в Повышении...

Повышение. Опции программы

14
ответ дан 3 December 2019 в 13:37
поделиться

Если Вы просто хотите обработать параметры командной строки сами, самый легкий путь состоит в том, чтобы поместить:

vector<string> args(argv + 1, argv + argc);

наверху Вашего main(). Это копирует все параметры командной строки в вектор std::strings. Затем можно использовать == сравнить строки легко, вместо бесконечного strcmp() вызовы. Например:

int main(int argc, char **argv) {
    vector<string> args(argv + 1, argv + argc);
    string infname, outfname;

    // Loop over command-line args
    // (Actually I usually use an ordinary integer loop variable and compare
    // args[i] instead of *i -- don't tell anyone! ;)
    for (vector<string>::iterator i = args.begin(); i != args.end(); ++i) {
        if (*i == "-h" || *i == "--help") {
            cout << "Syntax: foomatic -i <infile> -o <outfile>" << endl;
            return 0;
        } else if (*i == "-i") {
            infname = *++i;
        } else if (*i == "-o") {
            outfname = *++i;
        }
    }
}

[РЕДАКТИРОВАНИЕ: Я понял, что копировал argv[0], название программы, в args - фиксированный.]

18
ответ дан 3 December 2019 в 13:37
поделиться

Я предложил бы пользоваться библиотекой. Существует классический и почтенный getopt, и я уверен другие.

5
ответ дан 3 December 2019 в 13:37
поделиться

Если бы Вы не хотите использовать повышение, я рекомендовал бы этот небольшой класс помощника.

0
ответ дан 3 December 2019 в 13:37
поделиться

Есть несколько хороших доступных библиотек.

Опции программы Boost - это довольно тяжеловесное решение, потому что для его добавления в ваш проект требуется повышение, а синтаксис несколько сбивает с толку (на мой взгляд). Тем не менее, он может делать практически все, включая параметры командной строки, которые переопределяют параметры, заданные в файлах конфигурации.

SimpleOpt - довольно сложный, но простой процессор командной строки. Это отдельный файл, имеющий простую структуру, но он обрабатывает только командную строку и разбирает ее на опции, вам нужно выполнить все проверки типов и диапазонов. Это хорошо как для Windows, так и для Unix, и поставляется с версией glob для Windows.

Getopt доступен в Windows. Он такой же, как на машинах Unix, но часто это библиотека GPL.

5
ответ дан 3 December 2019 в 13:37
поделиться

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

Используйте gperf для эффективной обработки командной строки на C/C++

Недостатки:

  • Для генерации кода хэш-таблицы на C/C++ нужно сначала запустить отдельный инструмент
  • Нет поддержки специфических интерфейсов командной строки. Например, система сокращений posix "-xyz", объявляющая несколько опций одним тире, была бы труднореализуема.

Преимущества:

  • Опции командной строки хранятся отдельно от кода на C++ (в отдельном конфигурационном файле, который не нужно читать во время выполнения, только во время компиляции).
  • В вашем коде есть только один переключатель (переключение значений перечисления), чтобы выяснить, какая у вас опция
  • Эффективность - O(n), где n - количество опций в командной строке, а количество возможных опций не имеет значения. Самой медленной частью, возможно, является реализация переключателя (иногда компиляторы склонны реализовывать их как блоки if else, что снижает их эффективность, хотя это маловероятно, если вы выбираете смежные значения, см: эту статью об эффективности переключателей )
  • Память, выделяемая для хранения ключевых слов, точно достаточна для набора ключевых слов и не больше.
  • Также работает на C

Используя IDE вроде eclipse, вы, вероятно, сможете автоматизировать процесс запуска gperf, так что единственное, что вам нужно будет сделать, это добавить опцию в конфигурационный файл и в оператор switch и нажать кнопку build...

Я использовал пакетный файл, чтобы запустить gperf и сделать некоторую очистку и добавить защитные элементы с помощью sed (в сгенерированный gperf .hpp файл)...

Итак, чрезвычайно лаконичный и чистый код в вашей программе и один автоматически генерируемый файл хэш-таблицы, который на самом деле не нужно изменять вручную. Я сомневаюсь, что boost::program_options сможет превзойти это даже без приоритета эффективности.

2
ответ дан 3 December 2019 в 13:37
поделиться
Другие вопросы по тегам:

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