Как использовать алгоритмы STL в Qt?

Читая "Программирование на языке C++ с использованием Qt 4, второе издание", я натолкнулся на эту тему: "Заголовок STL предоставляет более полный набор универсальных алгоритмов. Эти алгоритмы могут использоваться как в контейнерах Qt, так и в контейнерах STL. Если реализации STL Доступный на всех ваших платформах, вероятно, нет причин избегать использования алгоритмов STL, когда в Qt отсутствует эквивалентный алгоритм."

В нем говорится, что универсальные алгоритмы STL(которые определены в заголовке "алгоритм") также могут использоваться с контейнерами Qt. Но когда я запускаю следующий код, он показывает ошибку "sort: identifier not found":

#include <QApplication>
#include <algorithm>
#include <QVector>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 QVector<int>vec{9,6,10,5,7};
 sort(vec.begin(),vec.end());
    return a.exec();
}

Есть ли способ исправить это без использования алгоритмов Qt?

2 ответа

Решение

Эта функция находится в пространстве имен std, поэтому просто напишите:

#include <QApplication>
#include <algorithm>
#include <QVector>
using namespace std;//new line!

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 QVector<int>vec{9,6,10,5,7};
 sort(vec.begin(),vec.end());
    return a.exec();
}

Или пиши std::sort каждый раз:

#include <QApplication>
#include <algorithm>
#include <QVector>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 QVector<int>vec{9,6,10,5,7};
 std::sort(vec.begin(),vec.end());
    return a.exec();
}

Чтобы расширить ответ @ Чернобыля: библиотека C++ помещает все стандартные контейнеры, алгоритмы и т. Д. В пространство имен std, Это означает, что для их использования вы должны либо перенести их в глобальное пространство имен (using namespace std; или же using std::sort) или просто уточните имя самостоятельно std::sort(vec.begin(), vec.end());

Либо один работает нормально. Причина этого заключается в том, что в противном случае все идентификаторы в стандартной библиотеке фактически станут "зарезервированными словами", и вы не сможете (легко) использовать их в своих программах для собственного использования. Например, нет причины, по которой вы не можете написать функцию с именем sort себя, который сортирует определенную структуру данных. затем sort(..) будет вызывать вашу рутину, в то время как std::sort(..) будет вызывать тот в стандартной библиотеке. То же самое для find, erase, remove, string, list, и так далее.

Другие вопросы по тегам