0

我有一组整数设置一些东西;长度为 52。我正在使用循环来遍历集合,如下所示:

for(iterator A from 1st to 48th element)
 for(iterator B from A+1 to 49th element)
  for(iterator C from B+1 to 50th element)
   for(iterator D from C+1 to 51th element)
    for(iterator E from D+1 to 52th element)
    {
       //save the values from the actual positions in set in array[5]
    }

首先,我尝试使用迭代器来实现它,但后来我意识到不可能从position of another iterator +1. 然后我尝试使用指针并跳过这些值,但我只正确分配了第一个值,然后我不能跳到第二个等等。

我的代码是:

set<int> tableAll;
for(int i=4; i!=52; ++i) 
  tableAll.insert(i);

const int * flop1 = & * tableAll.begin();
cout << * flop1 << endl;
flop1++;
cout << * flop1 << endl;

当我得到cout指针的值时flop1,我得到 4 并且没关系,但是当我一次又一次地增加它时cout在屏幕上再次增加它时,我得到 0,然后是 49,然后是 0,然后是 1,然后是 0,而不是 5、6、7、8 和 9 .

那么如何正确地遍历我的集合呢?我假设使用指针会比一些迭代器解决方案更快。

4

3 回答 3

4

您绝对可以从另一个迭代器的偏移量进行迭代:

for (auto a(std::begin(mySet)), a_end(std::prev(std::end(mySet), 4));
        a != a_end; ++a)
    for (auto b(std::next(a)), b_end(std::next(a_end); b != b_end; ++b)
        ...

在 C++03 中,您可以编写nextbegin为了兼容性:

template<typename Iterator> Iterator next(Iterator it, int n = 1) {
    std::advance(it, n);
    return it;
}

template<typename Iterator> Iterator prev(Iterator it, int n = 1) {
    std::advance(it, -n);
    return it;
}

for (std::set<int>::const_iterator a(mySet.begin()),
        a_end(std::prev(mySet.end(), 4)); a != a_end; ++a)
    for (std::set<int>::const_iterator b(std::next(a)),
            b_end(std::next(a_end)); b != b_end; ++b)
        ...
于 2012-09-10T15:02:12.750 回答
1

这段代码不是最优的,因为它不需要迭代器比较,但是可以工作并且很简单:

set<int> tableAll;
for(int i=0; i!=52; ++i)
  tableAll.insert(i);

for( set<int>::iterator iA=tableAll.begin(); iA != tableAll.end(); ++iA  )
    for( set<int>::iterator iB=iA; ++iB != tableAll.end();  )
        for( set<int>::iterator iC=iB; ++iC != tableAll.end();  )
            for( set<int>::iterator iD=iC; ++iD != tableAll.end();  )
                for( set<int>::iterator iE=iD; ++iE != tableAll.end();  ) 
{
   cout<<*iA<<' '<<*iB<<' '<<*iC<<' '<<*iD<<' '<<*iE<<endl;
}
于 2012-09-10T15:19:17.600 回答
0

我建议将 复制set到临时std::vector. 您在循环中执行的所有操作对于向量和 O(1) 来说都是自然的(当然循环本身除外)这更容易阅读、编写,并且应该运行得更快

于 2012-09-10T16:04:22.597 回答