【问题标题】:c++ how to add values to vector (or array) by function?c ++如何通过函数向向量(或数组)添加值?
【发布时间】:2015-12-20 22:38:48
【问题描述】:

我想做一个 Eratosthenes 的筛子,这是我在prime 函数中做的,但问题是我想使用一个向量,或者类似的东西来存储这个值以备后用在代码上使用,剩下的就是二分查找了,但是我不知道vector的引用怎么用,我在java上做过,但是那里的引用很简单。

#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;

int *primes (int size)
{
    int* primArray = new int(size);
    int notPrime[size];
    for (int i = 0; i < size; i++)
        notPrime[i]=0;
    int cont = 0;
    for(int i = 2; i < size; i++)
    {
        if(notPrime[i] == 0)
        {
            primArray[cont] = i;
            cont++;
            int sum = i;
            for(int j = 1; sum < size; j++)
            {
                notPrime[sum] = 1;
                sum = j*i;
            }
        }
    }
    return primArray;
}

这里的问题

int search(int input, vector<int> array)
{
    int min = 0;
    int max = array.size() - 1;
    int guess = (min + max)/2;
    int output = -1;
    while (true)
    {
        if (array[guess] == input)
        {
            output = guess;
            break;
        }
        if (min > max)
        {
            output = -1;
            break;
        }
        if (array[guess] < input)
            min = guess + 1;
        else
            max = guess - 1;
        guess = (min + max)/2;
    }
    return output;
}

int main()
{
    scanf("%d", &input);
    //int* array = primes(200);
    /*for (int i = 0; i < 200; i++)
    {
        printf("%d, ", array[i]);
    }*/
    int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199};
    vector<int> primeArray (numbers, numbers + sizeof(numbers) / sizeof(*numbers));
    for (int i = 0; i < primeArray.size(); i++)
    {
        printf("%d, ", primeArray[i]);
    }
    cout<< "\n";
    printf("%d", search(input, primeArray));
}

【问题讨论】:

  • 您遇到了什么问题?

标签: c++ vector reference primes


【解决方案1】:
  • int* primArray = new int(size); 行不好,因为它只分配了 1 个初始化为 size 的元素,并不意味着分配 size 元素。
    要分配 size 元素,请使用 int* primArray = new int[size];
  • 可以使用&amp;声明引用
    像这样:int search(int input, vector&lt;int&gt;&amp; array)

【讨论】:

    【解决方案2】:

    首先,一点建议:

    不要混合 C++ 和 C 风格的代码。如果你想使用 printf()scanf() 使用 C。如果你想要 std::vectorstd::cout 然后使用 C++。 如果您使用 C 可以随意使用数组,但在 C++ 中,几乎从不鼓励您在有权访问 std::vector

    时使用数组

    混合使用这些编程风格只会让您的事情变得复杂。

    现在至于你的代码:

    您没有因为缺少引用传递而遇到问题。

    每次您执行search(input, primeArray) 时,您都会通过值传递primeArray。这意味着 std::vector&lt;int&gt; 的复制构造函数被调用,并在传递给搜索函数之前创建了向量的新副本。不过这不是问题,因为您没有修改 primearray 在您的搜索功能中

    如果您想通过引用传递,您可以更改search 的签名以获取这样的引用:int search(int input, vector&lt;int&gt;&amp; array)

    实际问题:

    在你的primes 函数中你有int* primArray = new int(size);,我怀疑这条线没有做你想要的。

    new int (size); 将在堆上分配 1 个 int 并将该值初始化为 size 的任何值。

    如果你想为size 整数分配一块内存,你需要int * primArray = new int[size];

    更多问题:

    main 函数的第一行中,您有scanf("%d", &amp;input);,但input 尚未在任何地方初始化。

    我知道您在 main 中注释掉了您调用 int* primes() 的部分,但您必须记住,如果您在任何地方分配动态内存,您必须稍后释放该内存。在您的情况下,因为您的程序在main 的末尾结束,您的动态内存将被隐式释放,但最好自己释放内存。

    到期失败会在您的程序中引入内存泄漏

    【讨论】:

    • 非常感谢,我会听取你关于不要混合语言的建议,好吧,我会说这个程序可以工作,但我想更好地使用向量而不是数组,我已经让程序打印素数并手动将它们复制到数组中,这是不正确的,但现在我将使用向量谢谢
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2017-06-08
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多