2012-09-10 90 views
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。

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

+0

对于集合中第48个元素的理解是什么,因为一个集合没有秩序的概念?也许矢量更适合? –

+1

@LuchianGrigore:假设它是'std :: set',那么它肯定有一个order的概念。 –

+2

从另一个迭代器+ 1的位置开始迭代器有什么困难?只需从其他迭代器初始化迭代器,然后对其进行增量。对于(auto newIterator = oldIterator; ++ NewIterator!= set.end();)从实现的角度来看,@ –

回答

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) 
     ... 
+0

虽然这需要大约两倍的迭代次数。 'a!= mySet.end()'的循环条件会给出相同的结果,并且可能会更有效。 –

+0

@MikeSeymour啊,没有看到这个集合的大小是52.这使得它更容易。 – ecatmur

+0

我可以发誓'std :: next'在C++ 03中,但文档支持你 –

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; 
} 
+0

这是行不通的,iA应该在结束前停止5个元素,iB 4,iC 3,iA 2和iA 1元素。 –

+0

它的确如此。你甚至不测试它的权利?最后一行打印的是“47 48 49 50 51”。 – Arpegius

0

我建议复制set临时std::vector。 你在循环中做的所有操作对于一个向量和O(1)是自然的(当然除了循环本身) 这更容易阅读,编写,并且应该更快地运行很多

+0

真的吗?我认为前向迭代应该更快,或者至少与向量一样快。 –

+0

确切的时间取决于实施。 'set'通常是一个rb-tree。这意味着有时它必须遍历树的大部分才能获得下一个元素。这只是*下一个元素。要获得第n个元素,必须重复n次。没有捷径。对于vector来说,无论你想要下一个还是第n个元素,它总是(非常短)不变的时间。 – rtlgrmpf

+0

好的,所以我告诉你我需要整个代码: 1)一些容器用于存储没有使用索引的值:集合中的插入和擦除最适合我 2)从这些值开始到结束迭代:它们不会''必须进行排序和容器不必检查值是否是唯一的,因为它们是 ..我认为这是一切,并在第一次看,我认为这是最好的设置它 http:// www .cplusplus.com/reference/stl/set/get_allocator/..示例代码看起来像解决我的问题,我将通过指针迭代集,我只是不知道该怎么做... –