На этот вопрос уже есть ответ здесь:
Я новичок в 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;
}
}
В
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
swap
stuff,std::vector
это способ передать массив с его размером.