C++ сортировка динамического массива строк — сортировка не работает [дублировать]

На этот вопрос уже есть ответ здесь:

Я новичок в C++ и хочу сортировать динамический массив строк, снабженный std::cin.

Я не знаю, что не так с моим кодом, но массив не сортируется.

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;

void sort_array(string *array);

int main() {
    cout << "Number of names to enter: " << endl;
    int nr_names;
    cin >> nr_names;
    string *names = new (nothrow) string[nr_names];

    if (names == nullptr) {
        cout << "Memory alocation failed" << endl;
    } else {
        for (int i = 0; i < nr_names; i++) {
            cout << "Enter a name: " << endl;
            cin >> names[i];
        }
        cout << "Entered names are: " << endl;
        for (int i = 0; i < nr_names; i++) {
            cout << names[i] << endl;
        }

        sort_array(names);

        cout << "Sorted names: " << endl;
        for (int i = 0; i < nr_names; i++) {
            cout << names[i] << endl;
        }
        delete[] names;
    }
    return 0;
}

void sort_array(string *array) {
    const int arSize = (sizeof(*array) / sizeof(array[0]) - 1);
    for (int startIndex = 0; startIndex < arSize; startIndex++) {
        int smallestIndex = startIndex;

        for (int currentIndex = startIndex+1; currentIndex < arSize; currentIndex++) {
            if (array[currentIndex] < array[smallestIndex]) {
                smallestIndex = currentIndex;
            }
        }
    swap(array[startIndex], array[smallestIndex]);
    }
}

Метод сортировки работает с фиксированным массивом. Поэтому я думаю, что могут быть некоторые проблемы с динамическим выделением памяти(которое я только начал изучать)

#include <algorithm>
#include <iostream>
#include <string>
using namespace std;


int main() {
    string array[5] ={"Mike", "Andrew", "Bob", "Nick", "Matthew"};
    const int arSize = 5;
    for (int startIndex = 0; startIndex < arSize; startIndex++) {
        int smallestIndex = startIndex;

        for (int currentIndex = startIndex+1; currentIndex < arSize; currentIndex++) {
            if (array[currentIndex] < array[smallestIndex]) {
                smallestIndex = currentIndex;
            }
        }
        swap(array[startIndex], array[smallestIndex]);
    }
    //print the sorted array - works
    for(int i = 0; i< arSize; i++){
        cout<<array[i]<<endl;
    }
}
Метки

1 ответ

  1. В void sort_array(string *array)массиве не сортируется, потому const int arSize = (sizeof(*array) / sizeof(array[0]) - 1);что это не размер массива. Это… 0.

    он должен бытьconst int arSize = sizeof(array) / sizeof(array[0]), но работает только в том случае, если arrayявляется массивом, а не указателем на элементы.

    таким образом, ваш цикл никогда не выполняется (поэтому вы должны передать размер вдоль)

    Как прокомментировал Джастин, поскольку вы используете C++ и advanced swapstuff, std::vectorэто способ передать массив с его размером.