所以,我有一个奇怪的问题。我有一个校验和的向量,基本上,按时间排序,我想找出两个匹配的校验和之间的任何校验和。换句话说,如果我们有:
std::vector < std::string > checksums = {"foo","bar","baz","foo"};
我希望它按顺序报告FALSE,TRUE,TRUE,FALSE。
如果每个校验和需要针对每个/其他/校验和进行检查,那么我如何有效地执行此操作?哈希表示例here,用于识别重复元素,可能是这个难题的一部分,但它与我正在寻找的相反。
答案 0 :(得分:3)
我将概述一个基本方法:
std::map<std::string, size_t> position;
for (size_t i=0; i<checksums.size(); ++i)
{
std::map<std::string, int>::iterator prev=position.find(checksums[i]);
if (prev == position.end())
{
position.insert(std::make_pair(checksums[i], i));
}
else
{
size_t j=prev->first;
positions.erase(prev);
// Everything between index #j and index #i
}
}
我没有测试过这是否会编译,如果没有,这是一个小错字。
您没有指定处理不明确的情况。即,{{foo“,”bar“,”baz“,”foo“,”foobar“,”foo“}的列表 - 无论您是在第1和第2个foo之前寻找条目,还是第1和第3个foo。当然,我提出的解决方案假定前者,但对后者进行调整并不太难。
此外,还可以对算法进行一些进一步的改进。例如,可以将查找/比较/插入操作组合到单个操作中。怎么做,将成为你的家庭作业。提示:查看std :: map :: insert()的返回值。
编辑:这只找到匹配的范围。实际上,将结果转换为假/真值的向量并不是非常复杂。您可以将向量初始化为所有错误值,并在找到匹配范围时,将j之后和i之前的每个元素设置为true。