我有一个功能,我希望将一组中的每个元素与之前的元素进行比较。我想做这样的事情:
std::set<int> sSet;
std::set<int>::iterator it;
std::set<int>::iterator itR;
sSet.insert(1);
sSet.insert(2);
sSet.insert(3);
sSet.insert(4);
sSet.insert(5);
sSet.insert(6);
for (it=sSet.begin(); it!=sSet.end(); ++it) //simple forward loop
{
itR = it;
if(it != sSet.begin())
itR--;
for(;itR!=sSet.begin();itR--)
{
//Reverse iteration
//for comparing every element to all the previous elements
//Problem here is it goes up to the second element only and not first
//because of the condition itR!=sSet.begin()
}
}
我在考虑在这里使用反向迭代器但是我再也找不到从特定位置(或前向迭代器)设置反向迭代器的方法。
有没有正确的方法呢?
更新:上面使用的设置仅用于演示。实际实现为一组类,定义如下:
std::set<TBigClass, TBigClassComparer> sSet;
class TBigClassComparer
{
public:
bool operator()(const TBigClass s1, const TBigClass s2) const
{
//comparison logic goes here
}
};
答案 0 :(得分:1)
想反向?!使用反向迭代器:
std::set<int> sSet;
std::set<int>::iterator it;
std::reverse_iterator<std::set<int>::iterator> itR;
sSet.insert(1);
sSet.insert(2);
sSet.insert(3);
sSet.insert(4);
sSet.insert(5);
sSet.insert(6);
for (it=sSet.begin(); it!=sSet.rend(); ++it) //simple forward loop
{
itR = std::reverse_iterator<std::set<int>::iterator>(it);
for(;itR!=sSet.rbegin();++itR)
{
//Reverse iteration
//for comparing every element to all the previous elements
//Problem here is it goes up to the second element only and not first
//because of the condition itR!=sSet.begin()
}
}
请注意,当反转迭代器时,反转版本不会指向范围内的相同元素,而是指向它之前的元素。这样,为了安排范围的过去元素:指向范围中的过去元素的迭代器,当被反转时,被更改为指向最后一个元素(不是通过它) )范围(如果反转,这将是范围的第一个元素)。如果一个范围中第一个元素的迭代器被反转,则反转的迭代器指向第一个元素之前的元素(如果反转,这将是范围的过去元素)。
答案 1 :(得分:0)
您可以使用内部while循环:
while (true)
{
// do your comparison here
if (itR == sSet.begin())
break;
--itR;
}