【发布时间】: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;
【问题讨论】:
-
您不使用
std::string的任何原因? -
@ThomasMatthews 我想在字符串上应用集合操作并不会给出基于位置的差异
标签: c++ string stl-algorithm