获取两个目录之间的路径“差异”

时间:2010-10-21 09:33:29

标签: c++ directory filesystems

情况:

我有一个或多个绝对路径,例如:

  1. /家庭/本杰明/测试/
  2. /家庭/本杰明/测试/ A / 1
  3. /家庭/本杰明/测试/ B / 1
  4. 如何区分两条路径?假设我想知道如何从路径1到路径2.预期结果将是

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

    是否有比彼此减去字符串更优雅的方式?

5 个答案:

答案 0 :(得分:2)

我会尝试使用std::mismatchdocumentation

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

答案 1 :(得分:1)

我不知道调用xxxx(...)方式,但由于文件路径是树,我原本认为tree traversal algorithm会像它一样优雅......

this question中有些内容。

答案 2 :(得分:1)

您可以使用简单的正则表达式执行此操作:

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

这是complete example in Ruby。您可以在命令行中对其进行测试并开始使用它,或者此代码可以让您了解如何使用C ++编写正则表达式。

答案 3 :(得分:0)

您可以将所有路径插入Trie,并查看剩余的后缀。

更常见的是使用edit distance,并回溯最小编辑距离的步骤。

对我来说,两者看起来都更优雅。但是,首先减去字符串有什么问题?

答案 4 :(得分:0)

假设您并不担心像/home/benjamin/test/c/..这样的事情,那么这就变成了一个简单的子串匹配练习。

最懒的方式是使用像std::string::find这样的东西。或者,稍微循环遍历两个字符串直到它到达一个字符串的结尾,或者找到字符差异。