Получить путь "разница" между двумя каталогами - PullRequest
2 голосов
/ 21 октября 2010

Ситуация:

Я получил один или несколько абсолютных путей, например:

  1. / home / benjamin / test /
  2. / home / бенджамин / тест / a / 1
  3. / home / benjamin / test / b / 1

Как я могу получить разницу между двумя путями?Допустим, я хочу знать, как пройти от пути 1 до пути 2. Ожидаемый результат будет

/ home / benjamin / test / a / 1 - / home / benjamin / test / = / a / 1

Есть ли более элегантный способ, чем вычитать строки друг из друга?

Ответы [ 5 ]

2 голосов
/ 21 октября 2010

Я бы попробовал использовать std::mismatch ( документация )

template <class InputIterator1, class InputIterator2>
  pair<InputIterator1, InputIterator2>
    mismatch (InputIterator1 first1, InputIterator1 last1,
              InputIterator2 first2 );

Return first position where two ranges differ

Сравнивает элементы в диапазоне [first1,last1) с элементами в диапазоне, начинающемся с first2 последовательно, и возвращает, где происходит первое несовпадение.

Код:

string
mismatch_string( string const & a, string const & b ) {

    string::const_iterator longBegin, longEnd, shortBegin;

    if( a.length() >= b.length() ) {
        longBegin = a.begin();
        longEnd = a.end();
        shortBegin = b.begin();
    }
    else {
        longBegin = b.begin();
        longEnd = b.end();
        shortBegin = a.begin();
    }

    pair< string::const_iterator, string::const_iterator > mismatch_pair = 
        mismatch( longBegin, longEnd, shortBegin );

    return string(  mismatch_pair.first, longEnd );
}

A полный пример с outpu t загружен на кодовую панель.

1 голос
/ 26 октября 2010

Вы можете сделать это с помощью простого регулярного выражения:

return($1) if longer =~ /^#{shorter}(.*)$/

Вот полный пример в Ruby . Вы можете проверить это в командной строке и начать использовать его, или этот код может дать вам представление о том, как написать регулярное выражение в C ++.

1 голос
/ 21 октября 2010

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

Здесь есть вещи в этот вопрос .

0 голосов
/ 21 октября 2010

Если вы не беспокоитесь о таких вещах, как /home/benjamin/test/c/.., тогда это становится простым упражнением для подстроки.

Самый ленивый способ - использовать что-то вроде std::string::find. Альтернативно, небольшой цикл while, который перебирает обе строки до тех пор, пока не достигнет конца единицы, или не найдет разницу символов.

0 голосов
/ 21 октября 2010

Вы можете вставить все пути в Trie и посмотреть, какие суффиксы остаются.

Немного более общим является использование расстояния редактирования и повторение шагов для минимального расстояния редактирования.

Оба кажутся мне более элегантными. Однако что не так с вычитанием строк в первую очередь?

...