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

vector<vector<double>> + std::sort() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
27.04.2013, 19:09     vector<vector<double>> + std::sort() #1
Позвольте узнать... Возможно ли через vector<vector<double>> и функцию std::sort()
отсортировать строки массива в лексикографическом порядке?
Пример:
1 2 3
0 5 7
0 5 1
Получим:
0 5 1
0 5 7
1 2 3

Получится ли сравнивать строки через memcmp() для быстрого сравнения?
Как я понял, sort работает довольно быстро, быстрее чем ручная реализация быстрой сортировки.
Мне необходимо все по максимуму быстро работающее, т.к. используются большие массивы данных.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 19:16     vector<vector<double>> + std::sort() #2
Можно.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
typedef int vecType;
typedef vector<vecType> oneDimenVec;
typedef vector<oneDimenVec> twoDimenVec;
 
int main()
{
    srand(time(0));
 
    twoDimenVec vec { {1,2,3}, {0,5,7}, {0,5,1} };
 
    sort(begin(vec), end(vec), [](const oneDimenVec &a, const oneDimenVec &b) {
        return lexicographical_compare(begin(a), end(a), begin(b), end(b));} );
    for_each(begin(vec), end(vec), [](const oneDimenVec &v) {
            copy(begin(v), end(v), ostream_iterator<vecType>(cout, " "));
            cout << endl;
    });
 
    return 0;
}
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
27.04.2013, 19:25  [ТС]     vector<vector<double>> + std::sort() #3
Цитата Сообщение от Olivеr Посмотреть сообщение
return lexicographical_compare(begin(a), end(a), begin(b), end(b));}
а можно их сравнивать через memcmp? и если да, то кто быстрее сравнит?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 19:35     vector<vector<double>> + std::sort() #4
Тогда, как я считаю, данные придется хранить в каком-нибудь массиве.
Но толку? Если lexicographical_compare реализована на одном цикле, операторах !=, < ?
Можно даже самому написать, строчек 5-8.
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
27.04.2013, 20:24  [ТС]     vector<vector<double>> + std::sort() #5
Цитата Сообщение от Olivеr Посмотреть сообщение
twoDimenVec vec { {1,2,3}, {0,5,7}, {0,5,1} };
компилятор ругается на это... говорит, что перед первой { нужна запятая
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 20:25     vector<vector<double>> + std::sort() #6
Это для компиляторов с поддержкой C++11. Вам переписать для C++98?
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
27.04.2013, 20:44  [ТС]     vector<vector<double>> + std::sort() #7
Если можно, то буду очень признателен.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
27.04.2013, 20:51     vector<vector<double>> + std::sort() #8
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
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
using namespace std;
 
typedef int vecType;
typedef vector<vecType> oneDimenVec;
typedef vector<oneDimenVec> twoDimenVec;
 
bool compare(const oneDimenVec &a, const oneDimenVec &b)
{   return lexicographical_compare(begin(a), end(a), begin(b), end(b)); }
 
void print(const oneDimenVec &v)
{
    copy(begin(v), end(v), ostream_iterator<vecType>(cout, " "));
    cout << endl;
}
 
int main()
{
    twoDimenVec vec(3, oneDimenVec(3));
    vec[0][0] = 1;
    vec[0][1] = 2;
    vec[0][2] = 3;
    vec[1][0] = 0;
    vec[1][1] = 5;
    vec[1][2] = 7;
    vec[2][0] = 0;
    vec[2][1] = 5;
    vec[2][2] = 1;
 
    sort(vec.begin(), vec.end(), compare);
    for_each(vec.begin(), vec.end(), print);
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2013, 22:35     vector<vector<double>> + std::sort()
Еще ссылки по теме:

C++ Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &'
C++ Не работает функция sort (vector, vector)
Как изменять размер std::vector<std::vector>? C++

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

Или воспользуйтесь поиском по форуму:
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 584
Завершенные тесты: 2
27.04.2013, 22:35  [ТС]     vector<vector<double>> + std::sort() #9
а как скопировать строку из этой матрицы?
Yandex
Объявления
27.04.2013, 22:35     vector<vector<double>> + std::sort()
Ответ Создать тему
Опции темы

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