【问题标题】:The vector doesn't push_back the integer向量不会 push_back 整数
【发布时间】:2015-10-20 07:28:25
【问题描述】:

我写了一个简单的程序来生成素数。素数打印得很好。我还尝试将每个素数放入一个向量中以进行进一步处理,但不知何故,这些数字似乎并没有进入(即 push_back)向量,因为它打印出奇怪的数字而不是素数。总之,整个程序运行良好,只有向量有问题。请帮忙。

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

const int NUM = 300;

int main()
{
    int i, j ;
    int counter = 0;
    bool arr[NUM] = {false}; //false == 0
    vector<int> aVector;

    ...


    cout << "\nNumber of prime numbers is " << counter << endl;

    for (j=0; j<aVector.size() ; j++)
    {
        cout << "aVector[" << j << "] is " << aVector[j] << endl;
    }

   return 0;
}

【问题讨论】:

  • NUM 是如何定义的?
  • 你应该使用迭代器 (cplusplus.com/reference/vector/vector/begin) 来循环你的向量,这样你就不会越界。
  • 您在“似乎行不通”的想法和发布到互联网之间省略了一个关键步骤:您没有证明这部分实际上 i> 是行不通的,通过将您的示例简化为只是那个特定部分。你会意识到push_back() 不是问题所在。这是一项必不可少的调试技能,也是我们要求minimal, complete, verifyable 示例的原因。如果您在发帖之前根本没有意识到自己的错误,它只会让回答变得容易得多。
  • 除了越界访问(您可以通过将 bool arr[NUM] = { false }; 替换为 std::vector&lt;bool&gt; arr( NUM, false ); 并将所有出现的 [...] 替换为范围检查 .at(...) 来验证自己)- - 我无法使用代码在 GCC 4.8 / Linux、GCC 4.9 / Cygwin 或 MSVC 2010 上重现您的输出。所有三个都产生预期的输出(2、3、5、7、11、13、17、19、23 , 29),而不是您发布的内容。投票结束。
  • 代码仍然包含我指出的相同错误。 NUM+1 在所有地方都需要替换为 NUM

标签: c++ vector


【解决方案1】:

您的代码访问超出了arr 的范围。数组在 C++ 中是零索引的。

for (i = 2; i&lt;=NUM; i++) 应该是:for (i = 2; i&lt;NUM; i++)

for (j = 1; j &lt;= NUM/i; j++) 应该是:for (j = 1; j * i &lt; NUM; j++)

应用这些修复后,您的代码appears to work for me。我删除了if (i 检查,因为它是多余的。

【讨论】:

  • 那部分工作得很好。我认为您的建议不会有任何影响。
  • 你建议的部分我已经改了,但是vector还是不行。
  • @MLAC 用确切的代码更新您的问题,包括我的修复,这显然不起作用。确保您确认运行您在问题中发布的 exact 代码会导致问题。我之前看到你匆忙编辑。
【解决方案2】:

正如M.M 所指出的,在代码中的许多地方,您都试图从arr 数组的边界之外获取和设置值。这是 C++ 中未定义的行为。一旦你调用了一个未定义的行为任何事情都可能发生 - 你的整个程序的行为(不仅仅是包含错误的行)是不可预测的。在静态数组的边界之外写入通常会导致覆盖其他变量。

看起来您的程序覆盖了aVector 的内部数据,将其指针替换为动态分配的数组。难怪它会打印“随机垃圾”——向量现在认为它的内容在内存中的不同位置。

根据经验:Simple C [] arrays are evil,请改用向量:
vector&lt;bool&gt; arr(NUM, false)。要访问元素,请使用:arr.at(some_index)。如果some_index 在向量边界之外,这将引发异常。请注意,即使您使用向量,arr[some_index] 也不会执行边界检查,因此也会导致未定义的行为。

【讨论】:

  • 我所说的,但 +1 用于将其表达得更清楚,欢迎使用 StackOverflow。 ;-)
  • @Андрей Беньковский - 感谢您的建设性建议!你是我的英雄。它现在可以工作了......我同意你的观点,c/c++ 中的数组是邪恶的。
  • vector&lt;bool&gt; 比 C 风格的数组还要邪恶
  • @M.M.你没有给出任何解决方案。 Андрей Беньковский 的建议使用 vector 是一个非常好的主意。
  • @DevSolar 从技术上讲,您应该始终使用collection::iterator collection::reference collection::pointer 等。假设vector&lt;T&gt;::pointerT* 在大多数简单情况下都适用,但与@987654336 不兼容@ 和 custom allocators。附言我通常会做这个假设,除非有充分的理由做额外的工作(即项目中实际使用了自定义分配器)。
【解决方案3】:

这是一个简单的快速修复。循环到向量的末尾。

for (j=0; j<aVector.size() && j < 6; j++){
        cout << "aVector[" << j << "] is " << aVector[j] << endl;
}

------------我尝试的完整代码

#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>

using namespace std;
#define NUM 100
int main()
{
    int i, j ;
    int counter = 0;
    bool arr[NUM] = {false}; //false == 1
    vector<int> aVector;

    for (i = 2; i<=NUM; i++)
    {
        if (arr[i] == 0)
        {
            cout << setw(6) << i ; //i is a prime number

            /****doesn't seem to work****/
            aVector.push_back(i);  //fill the vector with prime numbers
            counter++;

            if (i <= NUM/2)
            {
                for (j = 1; j <= NUM/i; j++)
                {
                    arr[i*j] = 1;
                }
            }
        }
    }
    cout << "\nNumber of prime numbers is " << counter << endl;

    /*** it prints out strange numbers ******/
    for (j=0; j<aVector.size() && j < 6 ; j++){
        cout << "aVector[" << j << "] is " << aVector.at(j) << endl;
    }

    return 0;
}

【讨论】:

  • 如果我只想要前六个元素怎么办??
  • @MLAC 请立即检查.. 它适用于前 6 个元素
  • @MLAC 如果元素较少,它将仅提供当前向量中的元素
  • - 我得到以下输出:
  • aVector[0] 是 1177830227 aVector[1] 是 1348218928 aVector[2] 是 1769105761 aVector[3] 是 1917871982 aVector[4] 是 1936026985 aVector[5] 是 1852400220aVector[ aVector[7] 是 1348233077 aVector[8] 是 1769105761 aVector[9] 是 1917871982 aVector[10] 是 1936026985 ......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 2018-02-21
  • 2021-06-23
  • 2020-11-20
  • 2014-02-16
相关资源
最近更新 更多