Сортировка массивов строк С++ - программирование
Подтвердить что ты не робот

Сортировка массивов строк С++

У меня так много проблем, пытаясь выяснить функцию сортировки из библиотеки С++ и пытаясь отсортировать этот массив строк из a-z, пожалуйста, помогите!

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

// std::sort(stringarray.begin(), stringarray.end());

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

int main()
{
  int z = 0;
  string name[] = {"john", "bobby", "dear", 
                   "test1", "catherine", "nomi", 
                   "shinta", "martin", "abe", 
                   "may", "zeno", "zack", "angeal", "gabby"};

  sort(name[0],name[z]);

  for(int y = 0; y < z; y++)
  {
    cout << name[z] << endl;
  }
  return 0;
}
4b9b3361

Ответ 1

int z = sizeof(name)/sizeof(name[0]); //Get the array size

sort(name,name+z); //Use the start and end like this

for(int y = 0; y < z; y++){
    cout << name[y] << endl;
}

Изменить:

Учитывая все "правильные" соглашения об именах (согласно комментариям):

int N = sizeof(name)/sizeof(name[0]); //Get the array size

sort(name,name+N); //Use the start and end like this

for(int i = 0; i < N; i++){
    cout << name[i] << endl;
}

Примечание: Ответ Dietmar Kühl лучше всего во всех отношениях, std::begin() и std::end() должны использоваться для std::sort подобных функций с С++ 11, иначе их можно определить.

Ответ 2

Алгоритмы используют итератор в начале и в конце последовательности. То есть вы хотите вызвать std::sort() что-то вроде этого:

std::sort(std::begin(name), std::end(name));

Если вы не используете С++ 11 и у вас нет std::begin() и std::end(), их легко определить самостоятельно (очевидно, не в пространстве имен std):

template <typename T, std::size_t Size>
T* begin(T (&array)[Size]) {
    return array;
}
template <typename T, std::size_t Size>
T* end(T (&array)[Size]) {
    return array + Size;
}

Ответ 3

Пример использования std::vector

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

int main()
{
    /// Initilaize vector using intitializer list ( requires C++11 )
    std::vector<std::string> names = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    // Sort names using std::sort
    std::sort(names.begin(), names.end() );

    // Print using range-based and const auto& for ( both requires C++11 )
    for(const auto& currentName : names)
    {
        std::cout << currentName << std::endl;
    }

    //... or by using your orignal for loop ( vector support [] the same way as plain arrays )
    for(int y = 0; y < names.size(); y++)
    {
       std:: cout << names[y] << std::endl; // you were outputting name[z], but only increasing y, thereby only outputting element z ( 14 )
    }
    return 0;

}

http://ideone.com/Q9Ew2l

Это полностью исключает использование простых массивов и позволяет использовать функцию std:: sort. Возможно, вам понадобится обновить ваш компилятор, чтобы использовать = {...} Вместо этого вы можете добавить их, используя vector.push_back("name")

Ответ 4

Ваш цикл ничего не делает, потому что ваш счетчик z равен 0 (и 0 < 0 оценивается как false, поэтому цикл никогда не запускается).

Вместо этого, если у вас есть доступ к С++ 11 (и вы действительно должны стремиться к этому!), попробуйте использовать итераторы, например. используя функцию non-member std::begin() и std::end(), и цикл диапазона для отображения результата:

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

int main() 
{
    int z = 0;
    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    sort(begin(name),end(name));

    for(auto n: name){
         cout << n << endl;
    }
    return 0;    
}

Живой пример.

Ответ 5

Это работает для меня:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    int sname = sizeof(name)/sizeof(name[0]);

    sort(name, name + sname);

    for(int i = 0; i < sname; ++i)
        cout << name[i] << endl;

    return 0;
}

Ответ 6

Как уже было сказано выше, вы можете использовать std:: sort для сортировки, но что произойдет, когда вы, например, захотите сортировать из z-a? Этот код может быть полезен

bool cmp(string a, string b)
{
if(a.compare(b) > 0)
    return true;
else
    return false;
}

int main()
{
string words[] = {"this", "a", "test", "is"};
int length = sizeof(words) / sizeof(string);
sort(words, words + length, cmp);

for(int i = 0; i < length; i++)
    cout << words[i] << " ";
cout << endl;
    // output will be: this test is a 

}

Если вы хотите изменить порядок сортировки, просто измените знак в функции cmp.

Надеюсь, что это будет полезно:)

Ура!!!

Ответ 7

Мы можем сортировать() функцию сортировки массива строк.

Процедура:

  • Сначала определите массив строк размера.

  • использовать функцию сортировки. sort (имя массива, имя_базы и размер)

  • Итерация через строковый массив /


Фрагмент кода

#include<bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);

    string name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};

    int len = sizeof(name)/sizeof(name[0]);

    sort(name, name+len);

    for(string n: name)
    {
         cout<<n<<" ";
    }
    cout<<endl;

    return 0;
}

Ответ 8

В мультимножеством контейнере используется красно-черное дерево для сортировки элементов.

// using the multiset container to sort a list of strings.
#include <iostream>
#include <set>
#include <string>
#include <vector>


std::vector<std::string> people = {
  "Joe",
  "Adam",
  "Mark",
  "Jesse",
  "Jess",
  "Fred",
  "Susie",
  "Jill",
  "Fred", // two freds.
  "Adam",
  "Jack",
  "Adam", // three adams.
  "Zeke",
  "Phil"};

int main(int argc, char **argv) {
  std::multiset<std::string> g(people.begin(), people.end()); // """sort"""
  std::vector<std::string> all_sorted (g.begin(), g.end());
  for (int i = 0; i < all_sorted.size(); i++) {
    std::cout << all_sorted[i] << std::endl;
  }
}

Пример вывода:

Adam
Adam
Adam
Fred
Fred
Jack
Jess
Jesse
Jill
Joe
Mark
Phil
Susie
Zeke

Обратите внимание, что преимущество состоит в том, что мультимножество остается сортированным после вставки и удаления, отлично подходит для отображения активных подключений или нет.

Ответ 9

Мое решение немного отличается от любого из вышеперечисленных и работает так, как я его запускал. Так что для интереса:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
  char *name[] = {"john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby"};
  vector<string> v(name, name + 14);

  sort(v.begin(),v.end());
  for(vector<string>::const_iterator i = v.begin(); i != v.end(); ++i) cout << *i << ' ';
  return 0;
}

Ответ 10

Сравнительный ответ для комментария, который я получил выше, если кому-то интересно узнать о фактических результатах.

#include <iostream>
#include <string>
#include <algorithm>
#include <mach/mach_time.h>
using namespace std;

int main()
{
    uint64_t ts = mach_absolute_time();
    string name[] = { "john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", ", "abe", "may", "zeno", "zack", "angeal", "gabby" };

    int z = sizeof( name ) / sizeof( name[ 0 ] );

    sort( name, name + z );
    cout << ( mach_absolute_time() - ts ) << endl;

    for( int y = 0; y < z; ++y )
    {
        cout << name[ y ] << endl;
    }

    return 0;
}

Данный пример из исходного сообщения, используя std... с небольшими изменениями для добавления в профилирование. Среднее число десяти последовательных прогонов кода в среднем составляло около 34 тыс. На iOS (iPhone 4) и 49 тыс. На OSX (64-разрядный MacBook Air 2011).

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <mach/mach_time.h>

static int _sort( const void* a, const void *b )
{
    return strcmp( *( const char** )a, *( const char** )b );
}

int main()
{
    uint64_t ts = mach_absolute_time();
    const char* name[] = { "john", "bobby", "dear", "test1", "catherine", "nomi", "shinta", "martin", "abe", "may", "zeno", "zack", "angeal", "gabby" };

    int z = sizeof( name ) / sizeof( name[ 0 ] );

    qsort( name, z, sizeof( const char* ), _sort );
    printf( "%llu\n", ( mach_absolute_time() - ts ) );

    for( int y = 0; y < z; ++y )
    {
        printf( "%s\n", name[ y ] );
    }

    return 0;
}

Измененный пример с использованием qsort с таким же количеством последовательных прогонов дал в среднем около 12 тыс. на iOS (iPhone 4) и 10k на OSX (64-разрядный MacBook Air 2011).

Это примерно 3-5 раз в среднем, улучшение производительности. Результаты могут варьироваться в зависимости от контента, конечно... хотя, это цифры из приведенного фактического примера. Но да... огромное количество дополнительной работы в версии qsort просто не может приложить усилий. [/good ol 'sarcasm]