C++ &引用;向量<;布尔>;“迭代器不可取消引用”;MSVC中出错,但在使用g++;

C++ &引用;向量<;布尔>;“迭代器不可取消引用”;MSVC中出错,但在使用g++;,c++,c++11,visual-c++,vector,g++,C++,C++11,Visual C++,Vector,G++,我正在用布尔向量在MSVC中编写eratosthenes算法的筛选(因为我打算使用用户输入使数组/向量动态化) 我的代码: #include<iostream> #include<cmath> #include<vector> void sieve(std::vector<bool>& prime) { long long size = prime.size(); long long sq = (long long)sqr

我正在用布尔向量在MSVC中编写eratosthenes算法的筛选(因为我打算使用用户输入使数组/向量动态化)

我的代码:

#include<iostream>
#include<cmath>
#include<vector>

void sieve(std::vector<bool>& prime)
{
    long long size = prime.size();
    long long sq = (long long)sqrt(size);
    if (size >= 2)
        prime[0] = prime[1] = false;
    for (long long i = 2; i <= sq; ++i)
        if (prime[i])
            for (long long j = i*i; j <= size; j += i)
                prime[j] = false;
}

int main()
{
    int m, n;
    std::cout << "Enter first number: ";
    std::cin >> m;
    std::cout << "Enter second number: ";
    std::cin >> n;
    std::vector<bool> prime(n, true);
    sieve(prime);
    for (long long i = m; i <= n; ++i)
        if (prime[i])
            std::cout << i << std::endl;
}
#包括
#包括
#包括
空隙筛(标准:向量和素数)
{
long long size=prime.size();
长-长sq=(长-长)sqrt(尺寸);
如果(大小>=2)
素数[0]=素数[1]=假;
对于(长i=2;i n;
向量素数(n,真);
筛(素);
for(long-long i=m;i
for(long-long i=m;i
这是你的问题,位置大于向量的大小

我注意到的另一件事是向量的大小应该是
n*n

std::vector<bool> prime(n*n, true);
void sieve(std::vector<bool>& prime,int m,int n)
{
  long long size = prime.size();
  // long long sq = (long long)sqrt(size); you can use n for this so you don't have to make another variable.
  if (size >= 2)
    prime[0] = prime[1] = false;

  for (long long i = m; i < n; ++i)
  {
    if (prime[i])
    {
      for (long long j = i*i; j < n*n; j += i)
      {
        prime[j] = false;
      }
    }
  }
}
int main()
{
  int m, n;
  std::cout << "Enter first number: ";
  std::cin >> m;
  std::cout << "Enter second number: ";
  std::cin >> n;
  std::vector<bool> prime(n*n, true);
  sieve(prime,m,n);
  for (long long i = m; i <= n; ++i)
  {
    if (prime[i])
    {
      std::cout << i << std::endl;
    }
  }
}
std::向量素数(n*n,真);
空隙筛(标准::向量和素数,整数m,整数n)
{
long long size=prime.size();
//long-long-sq=(long-long)sqrt(size);您可以使用n来实现此目的,这样就不必再创建另一个变量。
如果(大小>=2)
素数[0]=素数[1]=假;
for(长i=m;im;
std::cout>n;
向量素数(n*n,真);
筛(粗筛,m,n);

对于(long long i=m;i噢,哇!很微妙,但确实解决了它。但我注意到它与g++一起工作。知道为什么吗?它并没有真正“工作”。当您超出数组边界时,行为是未定义的。更改编译器设置,添加代码等,并注意“工作”程序突然失败。@ SaaBbHathWar C++在你拧坏时不会可靠地失败。当你搞砸了,你会得到随机的东西,这可能是一些看起来有用的东西。这意味着你必须对编写代码的方式进行约束,而不仅仅是编写看起来有用的代码。在其他语言中,它试图预测失败,但一旦通过相对简单的构造,就会失败。您是否尝试使用-g选项编译它并使用gdb运行它?
std::vector<bool> prime(n*n, true);
void sieve(std::vector<bool>& prime,int m,int n)
{
  long long size = prime.size();
  // long long sq = (long long)sqrt(size); you can use n for this so you don't have to make another variable.
  if (size >= 2)
    prime[0] = prime[1] = false;

  for (long long i = m; i < n; ++i)
  {
    if (prime[i])
    {
      for (long long j = i*i; j < n*n; j += i)
      {
        prime[j] = false;
      }
    }
  }
}
int main()
{
  int m, n;
  std::cout << "Enter first number: ";
  std::cin >> m;
  std::cout << "Enter second number: ";
  std::cin >> n;
  std::vector<bool> prime(n*n, true);
  sieve(prime,m,n);
  for (long long i = m; i <= n; ++i)
  {
    if (prime[i])
    {
      std::cout << i << std::endl;
    }
  }
}