无法在索引 i 处更改向量的元素值

Fac*_*res 0 c++ primes vector

在 Stroustrup 的编程:使用 C++ 的原则和实践,第 4 章,练习 13 中,我必须编写一个程序来使用 Erathostenes 筛法查找给定范围内的所有素数。

到目前为止,我想出了这个:

vector<int> values;

void initialize_values()
{
    for (int i{0}; i < 100; ++i)
        values.push_back(1);
}


void remove_composites(vector<int> values)
{
    for(int i{2}; i * i < values.size(); ++i)
    {
        if (values[i] == 1)
        {
            for (int p{i + i}; p < values.size(); p += i)
                values[p] = 0; //not working
        }
    }
} 


int main()
{
    initialize_values();
    remove_composites(values);
    
    for (int i{2}; i < values.size(); ++i)
    {
        if (values[i] == 1)
            cout << i << " ";
    }
    cout << '\n';
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个大小为 100 的向量(在第一种情况下)并将元素初始化为 1。然后我检查iwhile 的所有索引倍数i * i < 100并将这些索引处的值更改为 0,最后打印值为 1 的索引。
问题是values[p] = 0没有将值 0 分配给索引处的元素,p我真的不明白为什么。

编辑所以在阅读评论和答案后,我决定将所有代码移到 下main(),因为我不知道如何使用引用。根据这本书,这个练习的目标是习惯于处理用户输入、使用循环、迭代等。在这一点上,它不是专业的,也不是专家。

对于所有在这里多年编码和回答问题的人,请记住您曾经是学习者和初学者。有一些尊重,不要把这个社区变成一个有毒的社区。

更新代码:

int main()
{
    vector<int> values;
    for (int i{0}; i < 100; ++i)
        values.push_back(1);
    
    for(int i{2}; i * i < values.size(); ++i)
    {
        if (values[i] == 1)
        {
            for (int p{i + i}; p < values.size(); p += i)
            {   
                //cout << p << " ";
                values[p] = 0;
            }
            //cout << '\n';
        }
    }
        
    for (int i{2}; i < values.size(); ++i)
    {
        if (values[i] == 1)
            cout << i << " ";
    }
    cout << '\n';
    
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

并按预期工作:

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
Run Code Online (Sandbox Code Playgroud)

谢谢大家。

Kon*_*lph 6

问题是values[p] = 0没有将值分配给0索引处的元素p

正在分配它。

问题是您正在对原始向量的副本进行操作,而该副本是 本地的remove_composites,这就是调用代码看不到更改的原因。

更改您的函数签名以使用引用类型参数:std::vector<int>&

您的代码还存在其他一些问题(使用错误的类型,即int代替bool; 不一致的签名;可变的全局变量)。