使用迭代器作为向量中的位置

时间:2015-02-24 00:09:51

标签: c++ vector

我试图使用矢量

编写Eratosthenes算法
1) Fill vector with integers 2 to N
2) Find the smallest integer i, print it, delete i, 2i, 3i, etc from vector
3) Repeat 2) until i is greater than square root of N

我对矢量很新,并且有点困在这里:

std::vector<int> x (n-1);

for (int i = 2; i < n+1; i++){     //fill vector with 2 to N
    x[i-2] = i;
}

float nsq = sqrt(n);

//iterate from 2 to sqrt(n):
for (std::vector<int>::iterator current = x.begin(); *current < nsq; current++){ 

    //access positions 0,2,4,6,8 etc in first iteration, 0,3,6,9 in next, etc
    for (int position = current - x.begin(); position <= x.end(); position += *current){
        //print x[position] only in first loop
        //delete x[position]              
    }
}

两个问题:

1)position&lt; = x.end();返回错误,我无法使用&#39; auto&#39;因为我不使用c ++ 11,虽然我不确定是否可以使用c ++ 11。解决这个问题的最佳方法是什么?

2)有没有办法在循环开始时只打印一次数字?或者我没有使用这种算法正确的方向/过度复杂吗?

编辑:刚刚意识到我确实过度复杂了,也谢谢你的回答。这是一个可接受的算法吗?

for (std::vector<int>::iterator current = x.begin(); *current < nsq; current++){

        for (int position = 0; position <= x.size(); position += *current){
            if(position == 0){
                std::cout << x[position] << std::endl;
            }
        //delete x[position]
        }
    }

2 个答案:

答案 0 :(得分:1)

  

1)position&lt; = x.end();返回错误,我无法使用&#39; auto&#39;因为我不使用c ++ 11,虽然我不确定是否可以使用c ++ 11。解决这个问题的最佳方法是什么?

迭代器没有意识到他们在他们正在迭代的容器中的位置。在最基本的层面上,迭代器只是一个可以智能移动的指针;在std::vector的情况下,它实际上只是指针的包装。

在此代码中,您要检查索引是否小于或等于指针;你比较了两件完全不同的东西,这些都没有多大意义。

如果你想知道迭代器在向量中的位置,最好转储迭代器并只使用索引,而不是试图混合两者。

  

2)有没有办法在循环开始时只打印一次数字?或者我没有使用这种算法正确的方向/过度复杂吗?

您可以检查position是否等于您在第一次迭代时的预期,如果匹配,则打印该数字。

答案 1 :(得分:0)

一旦您将数字识别为素数,您的意图是从矢量中删除其所有倍数。好的,这是可能的。但是你不能仅仅推断5的所有倍数(例如)在向量中相差5个位置,因为你已经删除了2和3的倍数,其中一些也是5的倍数。实施明智@ amchacon的建议将更加容易。

相关问题