&#34; vector <bool> iterator not dereferencable&#34; MSVC中的错误,但在使用g ++编译时效果很好

时间:2015-12-22 14:06:42

标签: c++ c++11 visual-c++ vector g++

我正在使用bool向量在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;
}

我偶然发现了MSVC中的运行时错误

MSVC Error

但是这个代码在使用g ++编译时非常有效。我不知道什么是错的。任何帮助都会很明显

谢谢

2 个答案:

答案 0 :(得分:1)

for (long long i = m; i <= n; ++i)for (long long j = i*i; j <= size; j += i)都会超过向量的末尾,因为vector_name[vector_size]在向量中的元素末尾超过了1。这是未定义的行为,你不幸的是它在g ++上工作。有些人从不费心去尝试在另一个编译器上编译以查看它们是否得到相同的结果。如果你没有在你的&#34;工作代码中出现一个无声的错误,那么。

将循环更改为for (long long i = m; i < n; ++i)for (long long j = i*i; j < size; j += i),您将不再超过向量的末尾。

答案 1 :(得分:1)

for (long long j = i*i
  prime[j] = false; 

这是你的问题,这个位置大于你的矢量大小。

我注意到的另一件事是你的矢量大小应该是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;
    }
  }
}

这应该有用;),不要忘记包含标题。