【问题标题】:position comparing two strings比较两个字符串的位置
【发布时间】:2017-05-18 01:39:57
【问题描述】:

我需要根据每个字符串中每个字符的位置计算 2 个文本字符串之间的差异。我需要想出从一个字符串到下一个字符串的删除和插入文本。因此,例如比较“Caty”与“Bat”应该表明位置 1 中的“C”被删除,位置 4 中的“y”被删除,“B”被插入在位置 1 和 2 个空格被插入在位置 4。

我尝试了以下方法,但是序列没有排序,并且 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;

【问题讨论】:

标签: c++ string stl-algorithm


【解决方案1】:

这可能有用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2021-12-12
    • 2020-09-05
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多