如何对字符串进行冒泡?

时间:2014-04-06 09:45:03

标签: c++

我正在尝试从用户输入输入并输入冒号然后输出结果。我的代码:

    #include<iostream>
    using namespace std;
    class bubble
    {
    public :

        string arr[20];

        //Number of elements in array
        int n;

        //Function to accept array elements
        void read()
        {
            while(1)
            {
                cout<<"\nEnter the number of elements in the array:";
                cin>>n;
                if(n<=20)

                    break;
                else
                    cout<<"\n Array can have maximum 20 elements \n";
            }
            //display the header
            cout<<"\n";
            cout<<"----------------------\n";
            cout<<"Enter array elements \n";
            cout<<"----------------------\n";

            //Get array elements
            for( int i=0; i<n ;i++ )
            {
                cout<<"<"<<i+1<<"> ";
                cin>>arr[i];
            }
        }
        //Bubble sort function
        void bubblesort()
        {
            for( int i=1;i<n ;i++ )//for n-1 passes
            {
                //In pass i,compare the first n-i elements
                //with their next elements
                for( int j=0; j<n-1; j++)
                {
                    if(arr[j] > arr[j+1])
                    {
                        string temp;
                        temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;

                    }

                }
            }
        }
        void display()
        {
            cout<<endl;
            cout<<"----------------------\n";
            cout<<"Sorted array elements \n";
            cout<<"----------------------\n";
            for( int j=0; j<n; j++)
                cout<<arr[j]<<endl;
        }
};
int main()
{
    //Instantiate an instance of class
    bubble list;
    // Function call to accept array elements
    list.read();
    // Function call to sort array
    list.bubblesort();
    //Function call to display the sorted array
    list.display();
    return 0;
}

代码运行正常,但它不接受字符串中的空格或缩进值作为输入。有没有办法让它接受这些价值观?

2 个答案:

答案 0 :(得分:1)

您必须将temp的类型更改为std::stringint只会出于显而易见的原因而使用整数。

如果遇到此类编译器错误,请首先尝试了解错误消息。为什么程序会尝试将字符串转换为整数?

然后,查看提到的行(文件名后面的第一个数字)。请记住,如果您正在使用预处理器宏,则此数字可能已关闭。

如果你去那条线,你会注意到它是:

temp = arr[j];

回到错误消息,很明显,在这一行中你试图将一个字符串值赋给一个整数:

integer = string;

由于您需要字符串,因此您必须查看定义temp的位置。上升你会点击以下一行:

int temp;

宾果!既然你知道你需要一个字符串(并且该变量不在其他任何地方使用),你现在只需将类型交换为std::string就可以了:

string temp;

答案 1 :(得分:1)

  1. 不要使用原始数组。使用std::vector<std::string>。然后,20的奇怪魔法数限制也会消失。

  2. 我认为使用类只会使这里的事情复杂化。使用独立功能并传递std::vector<std::string> &作为参数。

  3. 请注意,C ++已经提供了排序功能。请参阅std::sort及相关的排序功能,看看它们是否符合您的需求。

  4. 在C ++中,您不会在以后初始化变量并设置其起始值(就像您的int temp一样)。这是一遍:int temp = /* starting value */;。但是,请注意该语句无论如何都是错误的,因为您正在尝试将字符串设置为int。

  5. 以下是您可以根据已有的更改排序功能的提示:

    #include <iostream>
    #include <string>
    #include <vector>
    
    void bubblesort(std::vector<std::string> &strings)
    {
        typedef std::vector<std::string>::size_type size_type;
        for (size_type i = 1; i < strings.size(); ++i) // for n-1 passes
        {
            // In pass i,compare the first n-i elements
            // with their next elements
            for (size_type j = 0; j < (strings.size() - 1); ++j)
            {
                if(strings[j] > strings[j+1])
                {
                    std::string const temp = strings[j];
                    strings[j] = strings[j + 1];
                    strings[j+1] = temp;
                }
            }
        }
    }
    
    int main()
    {
        std::vector<std::string> strings;
        strings.push_back("foo");
        strings.push_back("bar");
        strings.push_back("foobar");
    
        bubblesort(strings);
    
        for (std::vector<std::string>::const_iterator iter = strings.begin(); iter != strings.end(); ++iter)
        {
            std::cout << *iter << "\n";
        }
    }