我需要根据每个字符串中每个字符的位置来计算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;
答案 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);