Вы можете добиться этого, используя CTE (Common Table Expression) и функцию ранжирования.
SQL-запрос:
WITH CTE AS
(
SELECT Name,Longititue,latutute,Time,DENSE_RANK() OVER(PARTITION BY Name ORDER BY time desc) as RN
FROM MaxTime
)
SELECT * FROM CTE
WHERE RN = 1
Я использую STL почти во всех моих проектах для вещей от циклов (с итераторами) к разделению входа в программу.
Маркируйте входную строку пробелами и введите результат в станд.:: вектор для парсинга позже:
std::stringstream iss(input);
std::vector<std::string> * _input = new std::vector<std::string>();
std::copy(std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
std::back_inserter<std::vector<std::string> >(*_input));
Другими фаворитами от курса является станд.:: обратные и различные другие алгоритмы, определенные в <algorithm>
.
Мой фаворит следующий для изменения чего-либо streamable на строку:
template <class TYPE> std::string Str( const TYPE & t ) {
std::ostringstream os;
os << t;
return os.str();
}
Затем:
string beast = Str( 666 );
Самый полезный алгоритм (по моему скромному мнению) - станд.:: for_each
Я люблю вектор. Это - каковы массивы C++ должны были быть. Я делаю большую работу в реальном времени все же. Люди, которым не нужен determinisim, могли бы предпочесть список.
Примерно все используют heck из строки.
Я не добираюсь для использования алгоритма очень, поскольку мы все еще используем VS6 здесь (который не может обработать сложный шаблон instatiations). Это скоро передаст все же.
Я люблю istream_iterator и ostream_iterator.
Хороший простой способ считать поток и заставить его быть похожим на любой другой контейнер:
// Copies a stream of integers on the std input
// into a vector.
int main()
{
std::vector<int> data;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<>(),
std::back_inserter(data)
);
// By uisng the istream_iterator<> the input just becomes another container.
}
Используя вектор для замены pointer+new. Это огромно.
Я не могу вспомнить наличие фаворита или наиболее используемого алгоритма/предиката/итератора, просто тот, который сделал лучшее задание для того, что я пытался выполнить в то время.
functional
материал: bind1st
, bind2nd
, mem_fun
, equal_to
, и т.д. довольно полезно, если по некоторым причинам у каждого нет доступа к Повышению, Связывают.
Это - очень субъективный вопрос, и много зависит от Вашего стиля кодирования команды, типа проекта и других неизвестных факторов.
Существуют не наиболее используемые алгоритмы STL, предикаты или итераторы. Это похоже на выяснение, что является наиболее используемым оператором на языке C++. Что Вы используете чаще, operator+
или operator-
? Вы предпочитаете if
кому: while
? Или возможно к throw
?
Все используется, когда это должно использоваться.
PS: Я предлагаю, чтобы Вы считали Эффективный STL Scott Meyers прежде, чем задать такие вопросы.
Спросите живописца, "что Ваш фаворит/больше всего использовал кисть?" :)
Следующее является несколько "злым", но оно сохранило нас от многих ошибок.
(Обновление, благодаря комментарию @Ricky65 для того, чтобы отодвинуть меня здесь.) C++ 11 имеет основанное на диапазоне для цикла, который далеко превосходит это, если Ваш компилятор поддерживает его; мы все еще работаем с некоторыми действительно старыми компиляторами, все же.
#define FOREACH(iter,stlContainer) \ for ( typeof(stlContainer.begin()) iter = stlContainer.begin(), \ iter##End_Cached = stlContainer.end(); \ iter != iter##End_Cached; \ ++iter )
(Дальнейшее обновление, кредит к Повышению devs.) Это свободно основано на более сложном, но более способном BOOST_FOREACH
макрос, но имеет преимущество того, чтобы быть намного легче ступить через в сборки отладки для маленьких случаев и не требование маленькой груды заголовков повышения (который в некоторых кодовых базах/группах является verboten).
Используя std::for_each
обычно предпочтительно, но имеет некоторые недостатки:
bind1st
/ bind2nd
/ ptr_fun
/ mem_fun
для использования его эффективно для нетривиального "посещения" - повышение устраняет много этих проблем, но не все имеет или знает повышениеМакрос FOREACH, как упомянуто выше обеспечивает несколько вещей:
std::for_each
, Вы не поймете свои граничные испытания превратно (никакая итерация одного прошлого конец, и т.д.)const_iterators
по постоянным контейнерамОбратите внимание, что это действительно требует несколько нестандартного "typeof" расширения.
Типичное использование могло бы быть:
list< shared_ptr< Thing > > m_memberList; // later FOREACH( iter, m_memberList ) { if ( (*iter)->getValue() < 42 ) { doSomethingWith( *iter ); } }
Я не совсем доволен этим макросом, но это было неоценимо здесь, специально для программистов без такого же опыта в осведомленном о STL дизайне.
(Не стесняйтесь указывать на профессионалов/недостатки/дефекты, я обновлю ответ.)