одна строка утверждает, чтобы проверить, отсортирован ли контейнер STL - PullRequest
13 голосов
/ 02 июня 2010

Есть ли способ написать однострочное условие, которое бы возвращало true, если контейнер STL отсортирован? Рассматриваемый контейнер - это std :: vector

Я собираюсь использовать его в утверждении

Ответы [ 3 ]

23 голосов
/ 02 июня 2010

Используйте holy_find в сочетании с меньшим или большим функтором.

Ограничение:
Вы должны знать, отсортирован ли контейнер по возрастанию или по убыванию.

Если vector предполагается отсортировать в порядке возрастания:

//Checks the first element where adjacent value where elem > nextElem
//returns end if the vector is sorted!
//Complexity is O(n)
vector<int>::iterator pos =  std::adjacent_find (aVec.begin(), aVec.end(),   // range
                                     std::greater<int>());               


if (pos == aVec.end()) 
{
    std::cout<<" sorted"<<endl;
}
else
{
    std::cout<<"Not sorted"<<endl;
}
8 голосов
/ 02 июня 2010

Вы можете использовать std :: is_sorted (vec.begin (), vec.end ()), чтобы проверить, отсортирована ли она. Обратите внимание, что это O (n).

0 голосов
/ 02 июня 2010

Это зависит от того, какой тип данных STL вы хотите использовать.

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

Список требует, чтобы вы явно вызвали функцию сортировки. Вам нужно будет отслеживать, сортировали ли вы это или нет.

Надеюсь, это поможет.

...