【问题标题】:C++: Why is the created vector not passing to the next set of for loops?C++:为什么创建的向量没有传递到下一组 for 循环?
【发布时间】:2015-07-03 18:10:11
【问题描述】:

我有它,以便用户定义矢量的大小,然后填充一个矢量。然后使用冒泡排序(家庭作业)对该向量进行排序。但是,当显示“排序的”向量时,其中的数字与原始创建中的数字不同。如何先创建向量,显示,然后排序显示??

#include <iostream>
#include <vector>
#include <cmath>
#include <numeric>
using namespace std;

int main()
{
    int n;
    double average=0.0;
    int median = 0;
    double size = 0.0;
    int i=0;

    cout<<"Vector Length?: "<<endl;
    cin>>n;
    vector<int> data;
    srand(time(NULL));


    //Filling vector
    for (int i=0; i<n; i++)
    {
        data.push_back(rand()%10+1);
    }
    for (int i=0; i<data.size(); i++)
    {
        cout<<"Vector: "<< data[i]<<endl;
    }

    size = data.size();

    //Sorting
    void bubbleSort(vector<int> & data);
    {
        for (int k = 1; k < size; k++)
        {
            for (int i = 0; i<size -1 - k; i++)
            {   
                if (data[i] > data[i +1])
                {
                    int temp = data[i];
                    data[i] = data[i + 1];
                    data[i + 1] = temp;
                }
                cout<<"Sorted vector: "<< data[i]<<endl;
            } 
        }               
    }   

【问题讨论】:

  • for (auto i : data) { std::cout &lt;&lt; i &lt;&lt; ' ';}
  • 你已经在你的 main 中声明了一个函数 void bubbleSort(vector&lt;int&gt;&amp; data)。你想用它做什么?
  • 为什么要在排序循环中打印矢量元素?您应该在完成排序后执行此操作。
  • Barmar 是正确的,您需要将打印移到排序循环之外。您当前的程序不会打印实际的排序向量。打印的元素数量甚至可能不是当前设计的向量中的元素数量。
  • 感谢大家的帮助。 @Phantom 我试图创建和使用一个函数。我认为函数可以在 int main 中创建?

标签: c++ sorting vector parameter-passing


【解决方案1】:

首先:

  1. 确保包含所有必要的头文件,例如stdlib.h 用于您使用的 rand() 函数。
  2. 删除所有未使用的变量,例如 averagemediansize
  3. main 函数之外声明您的 bubbleSort 函数,并添加额外的检查代码以防止在列表不超过一个元素时进行排序。

排序问题和你的这段代码sn-p有关:

for (int i = 0; i<size -1 - k; i++) { ... }

只需删除 -1

要解决您的排序问题并获得更好的输出,请使用以下代码:

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <cmath>

using namespace std;

void bubbleSort(vector<int>& data)
{
    if(data.size() <= 1)
        return;

    for(int i=1; i<data.size(); i++)
    {
        for(int j=0; j<data.size()-i; j++)
        {
            if(data.at(j) > data.at(j+1))
            {
                int temp = data.at(j+1);
                data.at(j+1) = data.at(j);
                data.at(j) = temp;
            }
        }
    }
}

int main()
{
    int n;
    vector<int> data;

    cout << "Vector Length?: ";
    cin >> n;

    // Filling vector
    for(int i=0; i<n; i++)
        data.push_back(rand()%10+1);

    cout << "Vector: ";
    for(int i=0; i<data.size(); i++)
        cout << data.at(i) << ", ";

    // Sorting
    bubbleSort(data);

    cout << endl << "Sorted Vector: ";
    for(int i=0; i<data.size(); i++)
        cout << data.at(i) << ", ";

    return 0;
}

希望这会有所帮助;)

【讨论】:

  • 所以有了&lt;stdlib.h&gt;,你就不需要使用srand(time(NULL)了吗?
  • @Aaron no 但&lt;stdlib.h&gt; 是使rand()srand() 可用所必需的。由于您希望每次执行代码时都有随机选择的数字,因此只需在执行 rand() 函数之前添加您的代码 sn-p:srand(time(0))
【解决方案2】:
#include <iostream>
#include <vector>
#include <cmath>
#include <numeric>
using namespace std;

void printVector(vector<int> & data)
{
    for (int i=0; i<data.size(); i++)
    {
        cout<<"Vector: "<< data[i]<<endl;
    }
}

//Sorting
void bubbleSort(vector<int> & data);
{
    size = data.size();
    for (int k = 1; k < size; k++)
    {
        for (int i = 0; i<size -1 - k; i++)
        {   
            if (data[i] > data[i +1])
            {
                int temp = data[i];
                data[i] = data[i + 1];
                data[i + 1] = temp;
            }
        } 
    }               
}   

int main()
{
    int n;
    double average=0.0;
    int median = 0;
    double size = 0.0;
    int i=0;

    cout<<"Vector Length?: "<<endl;
    cin>>n;
    vector<int> data;
    srand(time(NULL));


    //Filling vector
    for (int i=0; i<n; i++)
    {
        data.push_back(rand()%10+1);
    }
    printVector(data);
    bubbleSort(data);
    printVector(data);

}

【讨论】:

    【解决方案3】:
    1. 如果您打算稍后定义函数 void bubbleSort(vector & data),则需要在调用之前声明它。\

      void bubbleSort(vector<int> & data); int main() { // Here your code bubbleSort(data); //Here your code }

    2. 您只需要在需要之前定义变量。如果您声明并且从不使用它,您将收到未使用的变量警告。因此,您可以更好地评论所有这些变量。您可以随时取消评论。

      //double average=0.0; //int median = 0;

    3. 您应该从main() 调用您的函数bubbleSort(),如下所示:

      bubbleSort(data);
      
    4. 您没有正确使用迭代器索引对向量的元素进行排序。如果你改变你的功能 bubbleSort 如下它会工作

    //Sorting void bubbleSort(vector<int> & data) { int size = data.size(); for (int k = 1; k < size; k++) { for (int i = 0; i<size -1 ; i++) {
    if (data[i] > data[k]) { int temp = data[i]; data[i] = data[k]; data[k] = temp; } //cout<<"Sorted vector: "<< data[i]<<endl; } }
    }

    完整程序供您参考:

    #include <iostream>
    #include <vector>
    #include <cmath>
    #include <numeric>
    using namespace std;
    
     //Sorting
     void bubbleSort(vector<int> & data)
        {
             int size = data.size();
            for (int k = 1; k < size; k++)
            {
                for (int i = 0; i<size -1 ; i++)
                {   
                    if (data[i] > data[k])
                    {
                        int temp = data[i];
                        data[i] = data[k];
                        data[k] = temp;
                    }
                    //cout<<"Sorted vector: "<< data[i]<<endl;
                } 
            }               
        }   
    
    int main()
    {
        int n;
        //double average=0.0;
        //int median = 0;
        //double size = 0.0;
        //int i=0;
    
        cout<<"Vector Length?: "<<endl;
        cin>>n;
       // int n =10;
        vector<int> data;
        srand(time(NULL));
    
    
        //Filling vector
        for (int i=0; i<n; i++)
        {
            data.push_back(rand()%10+1);
        }
        for (unsigned int i=0; i<data.size(); i++)
        {
            cout<<"Vector: "<< data[i]<<endl;
        }
    
    
        bubbleSort(data);
        std::cout<<"sorted vector"<<"\n";
         for (unsigned int i=0; i<data.size(); i++)
        {
            cout<<"Vector: "<< data[i]<<endl;
        }
    
    }
    

    【讨论】:

    • 我希望我也可以将您的答案标记为最佳,这非常有帮助!谢谢!!进一步学习:是否可以在 int main 中创建并使用函数?还是必须始终按照您上面显示的方式使用它们?
    • @Aron 正如我在回答中指定的那样,您不能在另一个函数中定义一个函数,即使不在 main() 中也是如此。您只能从另一个函数调用一个函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2011-11-22
    • 2019-12-06
    相关资源
    最近更新 更多