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

Контейнеры с++ - C++

Восстановить пароль Регистрация
 
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
08.05.2013, 15:06     Контейнеры с++ #1
Ребят,подскажите пожалуйста,какую функцию нужно использовать,чтобы проверить массив на упорядоченность(мне нельзя использовать циклы и собственные функционалы),единственное что я придумал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <algorithm>
#include <iterator>
#include <functional>
#include <numeric>
 
int main()
{
    setlocale(LC_ALL,"Russian");
    double arr[] = { 11, 11, 13, 44, 55, 46, 77, 88, 99 };
    std::vector < double > vect( arr, arr + 9 );
    std::vector<double> vv ;
    std:: copy( vect.begin(), vect.end(), std::back_inserter(vv) );
    sort(vv.begin(),vv.end());
    bool l=std::equal(vect.begin(),vect.end(),vv.begin());
    if (l)
        std::cout<<"Массив упорядочен по неубыванию";
    else std::cout<<"Массив не упорядочен по неубыванию";
    return 0;
}
но это уж слишком неэффективно
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 15:06     Контейнеры с++
Посмотрите здесь:

C++ контейнеры
C++ Контейнеры
контейнеры С++ C++
C++ Ассоциативные контейнеры
[С++]Строки-контейнеры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 15:12     Контейнеры с++ #2
В С++11 есть is_sorted.
C++
1
std::is_sorted(std::begin(arr), std::end(arr));
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
08.05.2013, 15:20  [ТС]     Контейнеры с++ #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iterator>
#include <functional>
#include <numeric>
 
int main()
{
    setlocale(LC_ALL,"Russian");
    double arr[] = { 11, 11, 13, 44, 55, 46, 77, 88, 99 };
    std::vector < double > vect( arr, arr + 9 );
    //std::vector<double> vv ;
    //std:: copy( vect.begin(), vect.end(), std::back_inserter(vv) );
    //sort(vv.begin(),vv.end());
    //bool l=std::equal(vect.begin(),vect.end(),vv.begin());
    if (std::is_sorted(vect.begin(),vect.end()))
        std::cout<<"Массив упорядочен по неубыванию";
    else std::cout<<"Массив не упорядочен по неубыванию";
    return 0;
}
is_sorted не входит в std,так компилятор пишет
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 15:22     Контейнеры с++ #4
По-первых потрудитесь поставить теги.
Во-вторых - находится в заголовочном файле algorithm, однако ключевое слово: С++11.
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
08.05.2013, 15:40  [ТС]     Контейнеры с++ #5
Что нужно сделать чтобы использовать новый стандарт?

Добавлено через 8 минут
Или как обойтись функционалом старого стандарта,1997 года,если я не ошибаюсь?
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
08.05.2013, 16:32     Контейнеры с++ #6
Fissil, goto юзай
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.05.2013, 16:37     Контейнеры с++ #7
Fissil,
Что нужно сделать чтобы использовать новый стандарт?
Указать флажок компилятору/достать более новый компилятор.
Или как обойтись функционалом старого стандарта,1997 года,если я не ошибаюсь?
Так же как ты и сделал +-.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
08.05.2013, 16:38     Контейнеры с++ #8
Fissil, Извращенная проверка на неубывание
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main(){
    const int n = 9;
    double arr[n] = { 11, 11, 13, 44, 55, 54, 77, 88, 99 };
    int pos = 0, prev = -1e9;   
x:  if (pos == n) {
        std::cout << "YES";
    } else if (arr[pos] >= prev) {
            prev = arr[pos++];
            goto x;
        } else
            std::cout << "NO";
    return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
08.05.2013, 17:55     Контейнеры с++ #9
Fissil, std::mismatch это должен уметь... Но предикат в любом случае придётся писать.

Добавлено через 50 минут
Цитата Сообщение от rangerx Посмотреть сообщение
Но предикат в любом случае придётся писать.
Это я поспешил, есть же std::less_equal
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
08.05.2013, 19:53     Контейнеры с++ #10
Рекурсия?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
bool is_sorted(int *a, int n)
{
    if ( n >= 0)
    {
        if (*(a + n - 1) < *(a + n - 2))
            return false;
        is_sorted(a, n - 1);
    }
}
 
int main()
{
    int a[] = {1, 2, 3, 5, 5};
    std::cout << std::boolalpha << is_sorted(a, sizeof(a) / sizeof(*a)) << '\n';
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.05.2013, 20:56     Контейнеры с++ #11
Тоже решил поизвращаться...

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
 
#include <boost/mpl/vector.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/begin.hpp>
#include <boost/mpl/end.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/next.hpp>
#include <boost/mpl/prior.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/less_equal.hpp>
#include <boost/mpl/distance.hpp>
 
namespace mpl = boost::mpl;
 
template<typename Begin, typename Current, typename End,
template<typename, typename> class Compare, bool CurrentResult>
struct is_sorted_helper
{
private:
    typedef Current current_impl_t;
    typedef typename mpl::prior<Current>::type prior_impl_t;
    typedef typename boost::is_same<Begin, current_impl_t>::type current_eq_begin;
    typedef typename mpl::if_<current_eq_begin,
        current_impl_t, prior_impl_t>::type current_prior_t;
    typedef typename mpl::deref<current_prior_t>::type current_p_d;
    typedef typename mpl::deref<current_impl_t>::type current_d;
    typedef Compare<current_p_d, current_d> compare_t;
    typedef typename mpl::next<current_impl_t>::type next_impl_t;
    typedef is_sorted_helper<Begin, next_impl_t, End, Compare,
        compare_t::type::value> impl_t;
public:
    typedef Begin begin_t;
    typedef typename impl_t::current_t current_t;
    typedef typename impl_t::next_t next_t;
    typedef typename impl_t::prior_t prior_t;
    static const bool value = CurrentResult &&
        impl_t::value;
};
 
template<typename Begin, typename Current, typename End,
template <typename, typename> class Compare>
struct is_sorted_helper<Begin, Current, End, Compare, false>
{
private:
    typedef typename mpl::prior<Current>::type prior_impl_t;
    typedef typename boost::is_same<Begin, Current>::type prior_less_eq_current_t;
public:
    typedef Begin begin_t;
    typedef typename mpl::prior<Current>::type current_t;
    typedef typename mpl::prior<current_t>::type prior_t;
    typedef mpl::next<current_t> next_t;
    static const bool value = false;
};
 
template<typename Begin, typename End, template<typename, typename> class Compare>
struct is_sorted_helper<Begin, End, End, Compare, true>
{
    typedef Begin begin_t;
    typedef End current_t;
    typedef mpl::prior<current_t> prior_t;
    typedef End next_t;
    static const bool value = true;
};
 
template<typename Begin, typename End, template<typename, typename> class Compare>
struct is_sorted_range
{
    typedef is_sorted_helper<Begin, Begin, End, Compare, true> result_t;
    typedef typename result_t::begin_t begin_t;
    typedef typename result_t::current_t current_t;
    typedef typename result_t::prior_t prior_t;
    static const bool value = result_t::value;
};
 
template<typename Sequence, template<typename, typename> class Compare>
struct is_sorted_sequence
{
    typedef is_sorted_range<typename mpl::begin<Sequence>::type, typename mpl::end<Sequence>::type, Compare> result_t;
    typedef typename result_t::begin_t begin_t;
    typedef typename result_t::current_t current_t;
    typedef typename result_t::prior_t prior_t;
    static const bool value = result_t::value;
};
 
 
template<typename Result, bool>
struct trace_helper
{
    static void apply()
    {
        std::cout << "Sorted sequence" << std::endl;
    }
};
 
template<typename Result>
struct trace_helper<Result, false>
{
    static void apply()
    {
        typedef typename mpl::deref<Result::prior_t>::type prior_t;
        typedef typename mpl::deref<Result::current_t>::type current_t;
        typedef typename mpl::distance<Result::begin_t, Result::prior_t>::type p_distance_t;
        typedef typename mpl::distance<Result::begin_t, Result::current_t>::type c_distance_t;
        std::cout << "Condition failure between " << p_distance_t::value + 1 << " and " << c_distance_t::value + 1
            << " elements: " << prior_t::value << " > " << current_t::value << std::endl;
    }
};
 
template<typename Result>
void trace()
{
    trace_helper<Result, Result::value>::apply();
}
 
int main()
{
    typedef mpl::vector<mpl::int_<1>, mpl::int_<2>, mpl::int_<3> >::type sorted_vector;
    trace<is_sorted_sequence<sorted_vector, mpl::less_equal> >();
    typedef mpl::vector<mpl::int_<4>, mpl::int_<2>, mpl::int_<3> >::type not_sorted_vector;
    trace<is_sorted_sequence<not_sorted_vector, mpl::less_equal> >();
    typedef mpl::vector<mpl::int_<1> >::type one_el_vector;
    trace<is_sorted_sequence<one_el_vector, mpl::less_equal> >();
    typedef mpl::vector<>::type empty_vector;
    trace<is_sorted_sequence<empty_vector, mpl::less_equal> >();
    typedef mpl::vector<mpl::int_<1>, mpl::int_<3>, mpl::int_<2> >::type not_sorted_vector2;
    trace<is_sorted_sequence<not_sorted_vector2, mpl::less_equal> >();
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.05.2013, 22:37     Контейнеры с++ #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
adjacent_find вроде подходит
C++
1
2
3
4
template<typename FwdIt, typename BiPred>
bool is_sorted(FwdIt const first, FwdIt const last, BiPred const predicate) {
   return (std::adjacent_find(first, last, std::not2(predicate)) == last);        
}
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
10.05.2013, 19:16  [ТС]     Контейнеры с++ #13
А не могли бы вы написать код с mismatch,а то я пишу вот так:
std:air<std::vector<int>::iterator,int*> mypair;
mypair = std::mismatch(vect.begin(),--vect.end(),++vect.begin(),std::less_equal<double>());
и компилятор ругается

Добавлено через 14 минут
точнее там под less_equal тип int
std:air<std::vector<int>::iterator,int*> mypair;
mypair = std::mismatch(vect.begin(),--vect.end(),++vect.begin(),std::less_equal<int>());
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
10.05.2013, 20:08     Контейнеры с++ #14
С std::mismatch это будет выглядеть так(для непустого вектора)
C++
1
2
3
4
if(std::mismatch(v.begin(), v.end() - 1, v.begin() + 1, std::less_equal<int>()).first == v.end() - 1)
    std::cout << "sorted\n";
else
    std::cout << "unsorted\n";
но лучше всё же сделать, как предложено выше, через std::adjacent_find
C++
1
2
3
4
if(std::adjacent_find(v.begin(), v.end(), std::greater<int>()) == v.end())
    std::cout << "sorted\n";
else
    std::cout << "unsorted\n";
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 21:32     Контейнеры с++
Еще ссылки по теме:

контейнеры (литература) C++
ООП и контейнеры C++
Контейнеры C++

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

Или воспользуйтесь поиском по форуму:
Fissil
0 / 0 / 0
Регистрация: 22.09.2012
Сообщений: 19
10.05.2013, 21:32  [ТС]     Контейнеры с++ #15
Все работает,спасибо большое))
Yandex
Объявления
10.05.2013, 21:32     Контейнеры с++
Ответ Создать тему
Опции темы

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