Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.65
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
01.03.2011, 20:48     Сортировка массива си-строк #1
есть код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main(int argc, char **argv)
{
    const int n_size=20;
    char names[][n_size]={"Olexandr","Yasya","Lyuba","Tanya","Dima","Andriy","Yulya","Maksim"};
    sort(names,names+8);
    for(int i=0;i<7;i++) cout<<names[i]<<endl;
    system("pause>nul");
    return 0;
}
но выдает ошибку компиляции. Подскажите, пожалуйста, в чем ошибка. Компилятор говорит
Код
>c:\program files\microsoft visual studio 10.0\vc\include\algorithm(2637): error C2075: _Val: для инициализации массива требуются фигурные скобки
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 20:48     Сортировка массива си-строк
Посмотрите здесь:

Сортировка массива строк C++
C++ Сортировка с массива. Обработка строк
C++ Сортировка с массива. Обработка строк
СОртировка динамического массива строк C++
C++ Сортировка массива строк
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
01.03.2011, 21:02     Сортировка массива си-строк #2
Ну ошибка идёт при использовании алгоритма sort, но я им не пользовался так что не знаю как он работает.
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
01.03.2011, 21:03  [ТС]     Сортировка массива си-строк #3
Цитата Сообщение от Gepar Посмотреть сообщение
Ну ошибка идёт при использовании алгоритма sort, но я им не пользовался так что не знаю как он работает.
Ну это и так понятно, об этом написал компилятор...
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
02.03.2011, 22:31  [ТС]     Сортировка массива си-строк #4
ну что, неужели никто не знает?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.03.2011, 23:56     Сортировка массива си-строк #5
c_user, Вы не поверите, но С и С++ - это разные языки программирования.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
#define STRING_SIZE 20
#define STRINGS_COUNT 8
 
int cmpfunc(const void * a, const void * b) { return strcmp((char*)a, (char*)b); }
 
int main(void){
    char names[STRINGS_COUNT][STRING_SIZE] = { "Olexandr","Yasya","Lyuba","Tanya","Dima","Andriy","Yulya","Maksim" };
    int i;
    
    printf("Before: ");
    for ( i = 0; i < STRINGS_COUNT; ++i )
        printf("%s ", names[i]);
    qsort(names, STRINGS_COUNT, STRING_SIZE, cmpfunc);
    printf("\nAfter:  ");
    for ( i = 0; i < STRINGS_COUNT; ++i )
        printf("%s ", names[i]);
    
    printf("\n");
    exit(0);
}
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:08  [ТС]     Сортировка массива си-строк #6
Цитата Сообщение от easybudda Посмотреть сообщение
c_user, Вы не поверите, но С и С++ - это разные языки программирования.
Спасибо, а с использованием алгоритма sort без костылей это сделать невозможно?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
03.03.2011, 00:11     Сортировка массива си-строк #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
int main(){
  std::vector<std::string> vec = {
  "Olexandr", "Yasya", "Lyuba", "Tanya", "Dima", "Andriy", "Yulya", "Maksim"};
  std::sort(vec.begin(), vec.end());
  std::for_each(vec.begin(), vec.end(), [](std::string &s){std::cout << s << '\n';});
  return 0;
}
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:25  [ТС]     Сортировка массива си-строк #8
Цитата Сообщение от asics Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
 
int main(){
  std::vector<std::string> vec = {
  "Olexandr", "Yasya", "Lyuba", "Tanya", "Dima", "Andriy", "Yulya", "Maksim"};
  std::sort(vec.begin(), vec.end());
  std::for_each(vec.begin(), vec.end(), [](std::string &s){std::cout << s << '\n';});
  return 0;
}
упс, а я и не знал, что так вектор можно инициализировать... думал только так
C++
1
2
int numbersarr[]={0,1,2,3,4,5,6,7,8,9}ж
vector<int> numbers(numbersarr,numbersarr+10);
Добавлено через 2 минуты
Ааа, так оно и нельзя так! Код не работает
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
03.03.2011, 00:27     Сортировка массива си-строк #9
Цитата Сообщение от c_user Посмотреть сообщение
Ааа, так оно и нельзя так! Код не работает
Это по стандарту C++0x, работает только в GCC 4.5+ и MSVS10
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:31  [ТС]     Сортировка массива си-строк #10
Цитата Сообщение от asics Посмотреть сообщение
Это по стандарту C++0x, работает только в GCC 4.5+ и MSVS10
У меня и есть MSVS 2010
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
03.03.2011, 00:36     Сортировка массива си-строк #11
c_user, И вправду, в 10-ой студии не работает, значит только в GCC 4.5+
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.03.2011, 00:38     Сортировка массива си-строк #12
c_user, это qsort костыль? Нигде больше так не говорите - засмеют!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
 
int main(){
    const char * names[] = { "Olexandr","Yasya","Lyuba","Tanya","Dima","Andriy","Yulya","Maksim" };
    
    std::cout << "Before: ";
    std::copy(names, names + sizeof(names) / sizeof(*names), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    std::set<std::string> set;
    std::copy(names, names + sizeof(names) / sizeof(*names), std::inserter(set, set.begin()));
    std::cout << "After:  ";
    std::copy(set.begin(), set.end(), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    return 0;
}
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:42  [ТС]     Сортировка массива си-строк #13
Цитата Сообщение от asics Посмотреть сообщение
c_user, И вправду, в 10-ой студии не работает, значит только в GCC 4.5+
Спасибо. Но можно ли все таки отсортировать си-массив функцией sort?

Добавлено через 4 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
c_user, это qsort костыль? Нигде больше так не говорите - засмеют!
Я не qsort имел в виду. Вопрос был о возможности сортировать методом sort массивы, без костылей - это типа конвертации в вектор и назад.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.03.2011, 00:56     Сортировка массива си-строк #14
Цитата Сообщение от c_user Посмотреть сообщение
Вопрос был о возможности сортировать методом sort массивы, без костылей - это типа конвертации в вектор и назад.
Ну совсем без костылей не получится, но при желании всегда можно извернуться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <cstring>
 
struct Cmp {
    bool operator () (const char * const & a, const char * const & b){
        return strcmp(a, b) < 0;
    }
};
 
int main(){
    const char * names[] = { "Olexandr","Yasya","Lyuba","Tanya","Dima","Andriy","Yulya","Maksim" };
    
    std::cout << "Before: ";
    std::copy(names, names + sizeof(names) / sizeof(*names), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    std::sort(names, names + sizeof(names) / sizeof(*names), Cmp());
    
    std::cout << "After:  ";
    std::copy(names, names + sizeof(names) / sizeof(*names), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2011, 17:34     Сортировка массива си-строк
Еще ссылки по теме:

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

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
c_user
1 / 1 / 0
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 17:34  [ТС]     Сортировка массива си-строк #15
Цитата Сообщение от easybudda Посмотреть сообщение
Ну совсем без костылей не получится, но при желании всегда можно извернуться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <cstring>
 
struct Cmp {
    bool operator () (const char * const & a, const char * const & b){
        return strcmp(a, b) < 0;
    }
};
 
int main(){
    const char * names[] = { "Olexandr","Yasya","Lyuba","Tanya","Dima","Andriy","Yulya","Maksim" };
    
    std::cout << "Before: ";
    std::copy(names, names + sizeof(names) / sizeof(*names), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    std::sort(names, names + sizeof(names) / sizeof(*names), Cmp());
    
    std::cout << "After:  ";
    std::copy(names, names + sizeof(names) / sizeof(*names), std::ostream_iterator<std::string>(std::cout, " "));
    std::cout << std::endl;
    
    return 0;
}
Спасибо.
Вообще я векторами пользуюсь обычно, но просто интересно было, как в такой ситуации делать
Yandex
Объявления
03.03.2011, 17:34     Сортировка массива си-строк
Ответ Создать тему
Опции темы

Текущее время: 01:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru