我正在考虑一种改变两个循环顺序的方法 这是两个列表:
list<element> aList1;
list<element> aList2;
我想检查两个列表中的每个元素,以确保aList1中的元素是否等于aList2中的元素。
列表中的内容可以是:
<a,b,c,d> aList1
<k,a,b,z> aList2
所以,结果应该记录aList1中不匹配的位置3-4。
但内容也可以是:
<a,b,c>
<d,d,b,d>
因此,结果应记录在aList1中不匹配的位置1-2和4。我只专注于aList1的位置。
另一个:<a,b,c,d,e,f>
<z,e,f,g>
列表长度可以不同,匹配的元素对于位置5-6也是一致的。
我用(aList1){for(aList2){}}来做这件事,但是浪费了很多,你能给我一些好方法吗?非常感谢!
不仅对于列表,容器也可以是vector,map也是。
PS:元素非常复杂,不是0或1,实际上它们是指针(每个元素都包含几个因素,我需要逐个比较,所以这就是为什么我要比较循环比较少的元素)。答案 0 :(得分:0)
如果你想避免嵌套循环尝试这样的事情:
for (auto aIt = a.begin(), bIt = b.begin(); aIt != a.end() && bIt != b.end(); ++aIt, ++bIt)
答案 1 :(得分:0)
如果你可以对列表进行排序,那么对它们进行排序并通过一个循环中的两个指针进行比较(O(N log N))。
如果有少量不同的值(例如,如果只有0和1 - 它只是2个不同的数字),您可以计算每个数字的计数(例如0和1的数量)并检查结果。 (O(N))
如果可以将数字(如索引)与列表元素相关联,则可以有效地使用std :: bitset。它更复杂,但性能更高。查看this,操作AND。
仍然看看std::set_intersection。它非常清晰简单,实际上也适用于指针。
答案 2 :(得分:0)
您可能想要实现的模式如下:
auto it1, it2;
for (it1 = aList1.begin(), it2 = aList2.begin();
it1 != aList1.end() && it2 != aList2.end(); ++it1, ++it2) {
// code to check elements equality here
}
允许您验证两个列表中具有相同排名的元素的某些属性,或者支持标准库“可迭代”接口的容器(可以这么说)。请注意,您需要容器始终以一致的顺序返回元素,以便进行比较。