2010-10-21 3 views
2

Ситуация:Получить путь "разницу" между двумя каталогами

я получил один или более абсолютные пути, например:

  1. /дома/Benjamin/тест/
  2. /дома/Бенжамина/тест/а/1
  3. /дома/Benjamin/тест/б/1

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

/дома/Benjamin/тест/а/1 -/дом/Benjamin/тест/=/а/1

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

ответ

2

Я хотел бы попробовать использовать std::mismatch (documentation)

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); 
} 

full example with outpu т выгружается в codepad.

1

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

Существует материал здесь в this question.

0

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

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

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

0

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

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

1

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

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

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

Смежные вопросы