Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
c_user
1 / 1 / 1
Регистрация: 13.12.2010
Сообщений: 26
#1

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

01.03.2011, 20:48. Просмотров 2557. Ответов 14
Метки нет (Все метки)

есть код
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: для инициализации массива требуются фигурные скобки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 20:48
Ответы с готовыми решениями:

Сортировка строк массива
На форуме есть множество тем о сортировке массивов, но конкретно под свое...

Сортировка массива строк
Написать программу сортировки массива строк по убыванию длины. Ввод данных, ...

Сортировка массива строк
Здравствуйте!Не могу разобраться с сортировкой массива строк по алфавиту!...

Сортировка массива строк
Задание: Заполнить заранее проинициализированный массив строк фамилиями своей...

Сортировка строк массива
Задание:отсортировать по не возрастанию предпоследнюю строку массива. Массив...

14
Gepar
1181 / 537 / 77
Регистрация: 01.07.2009
Сообщений: 3,517
01.03.2011, 21:02 #2
Ну ошибка идёт при использовании алгоритма sort, но я им не пользовался так что не знаю как он работает.
0
c_user
1 / 1 / 1
Регистрация: 13.12.2010
Сообщений: 26
01.03.2011, 21:03  [ТС] #3
Цитата Сообщение от Gepar Посмотреть сообщение
Ну ошибка идёт при использовании алгоритма sort, но я им не пользовался так что не знаю как он работает.
Ну это и так понятно, об этом написал компилятор...
0
c_user
1 / 1 / 1
Регистрация: 13.12.2010
Сообщений: 26
02.03.2011, 22:31  [ТС] #4
ну что, неужели никто не знает?
0
easybudda
Модератор
Эксперт CЭксперт С++
10051 / 5971 / 1491
Регистрация: 25.07.2009
Сообщений: 11,305
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);
}
1
c_user
1 / 1 / 1
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:08  [ТС] #6
Цитата Сообщение от easybudda Посмотреть сообщение
c_user, Вы не поверите, но С и С++ - это разные языки программирования.
Спасибо, а с использованием алгоритма sort без костылей это сделать невозможно?
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
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;
}
1
c_user
1 / 1 / 1
Регистрация: 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 минуты
Ааа, так оно и нельзя так! Код не работает
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
03.03.2011, 00:27 #9
Цитата Сообщение от c_user Посмотреть сообщение
Ааа, так оно и нельзя так! Код не работает
Это по стандарту C++0x, работает только в GCC 4.5+ и MSVS10
1
c_user
1 / 1 / 1
Регистрация: 13.12.2010
Сообщений: 26
03.03.2011, 00:31  [ТС] #10
Цитата Сообщение от asics Посмотреть сообщение
Это по стандарту C++0x, работает только в GCC 4.5+ и MSVS10
У меня и есть MSVS 2010
0
asics
Freelance
Эксперт С++
2854 / 1789 / 355
Регистрация: 09.09.2010
Сообщений: 3,841
03.03.2011, 00:36 #11
c_user, И вправду, в 10-ой студии не работает, значит только в GCC 4.5+
0
easybudda
Модератор
Эксперт CЭксперт С++
10051 / 5971 / 1491
Регистрация: 25.07.2009
Сообщений: 11,305
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;
}
0
c_user
1 / 1 / 1
Регистрация: 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 массивы, без костылей - это типа конвертации в вектор и назад.
0
easybudda
Модератор
Эксперт CЭксперт С++
10051 / 5971 / 1491
Регистрация: 25.07.2009
Сообщений: 11,305
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;
}
0
c_user
1 / 1 / 1
Регистрация: 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;
}
Спасибо.
Вообще я векторами пользуюсь обычно, но просто интересно было, как в такой ситуации делать
0
03.03.2011, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2011, 17:34

Сортировка строк и столбцов массива
Люди добрые, кто чем может) Нужно написать не свап строк, а сортировку строк...

СОртировка динамического массива строк
#include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;locale&gt; #include &lt;iostream&gt;...

Сортировка массива строк по алфавиту c++
project raised exception class eaccessviolation with message 'access violation...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru