位置比较两个字符串

时间:2017-01-03 21:07:34

标签: c++ string stl-algorithm

我需要根据每个字符串中每个字符的位置来计算2个文本字符串之间的差异。我需要从一个字符串到下一个字符串中提取已删除和插入的文本。例如,比较凯蒂' vs.' Bat'应该表明' C'在位置1被删除,' y'在第4位被删除并且' B'插入位置1,在第4位插入2个空格。

我尝试了以下操作,但序列没有排序,Visual C ++在弹出对话框中指示启用了迭代器调试。我可以在应用设置差异操作之前对它们进行排序,但这不是我想要的。理想情况下,我想用简单的std :: strings与chars的向量来做这个,但我怀疑我可能不得不坚持使用chars或std :: vector>的向量。

std::vector<char> cat = {'C', 'a', 't', 'y'};
std::vector<char> bat = {'B', 'a', 't', ' ', ' '};
std::vector<char> removed;
std::set_difference(
    bat.begin(), bat.end(),
    cat.begin(), cat.end(),
    std::back_inserter(removed));
std::cout << removed << std::endl;
std::vector<char> inserted;
std::set_difference(
    bat.begin(), bat.end(),
    cat.begin(), cat.end(),
    std::back_inserter(inserted));
std::cout << inserted << std::endl;

接下来我尝试了这个 - 它有效 - 然而它迫使我使用似乎有点过分的集合 - 必须有一种更简单的方法来做类似于字符串的事情。

std::set<std::pair<int, char>> cat = {{0, 'C'}, {1, 'a'}, {2, 't'}, {3, 'y'}};
std::set<std::pair<int, char>> bat = {{0, 'B'}, {1, 'a'}, {2, 't'}, {3, ' '}, {4, ' '}};
std::set<std::pair<int, char>> removed;
std::set_difference(
    cat.begin(), cat.end(),
    bat.begin(), bat.end(),
    std::inserter(removed, removed.end()));
//std::cout << removed << std::endl;
std::set<std::pair<int, char>> inserted;
std::set_difference(
    bat.begin(), bat.end(),
    cat.begin(), cat.end(),
    std::inserter(inserted, inserted.end()));
//std::cout << inserted << std::endl;

1 个答案:

答案 0 :(得分:0)

这可能有用:

std::vector<std::pair<unsigned,char>> string_diff(const std::string& stra,const std::string& strb) {
    unsigned p = 1;
    std::vector<std::pair<unsigned,char>> ret;
    std::for_each(stra.begin(), stra.end(),[&](const char l) {
        if(strb.find(l) == std::string::npos) {
            ret.push_back(std::make_pair(p,l));
        }
        p++;
    });

    return ret;
}

std::string cat = "caty";
std::string bat = "bat  ";

auto removed = string_diff(cat,bat);
print(removed );

auto inserted = string_diff(bat,cat);
print(inserted);