Большая часть используемого алгоритма STL, предикатов, итераторов

Вы можете добиться этого, используя 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
6
задан Benj 12 April 2011 в 10:04
поделиться

11 ответов

Я использую 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>.

7
ответ дан 8 December 2019 в 02:16
поделиться

Мой фаворит следующий для изменения чего-либо streamable на строку:

template <class TYPE> std::string Str( const TYPE & t ) {
    std::ostringstream os;
    os << t;
    return os.str();
}

Затем:

string beast = Str( 666 );
9
ответ дан 8 December 2019 в 02:16
поделиться

Самый полезный алгоритм (по моему скромному мнению) - станд.:: for_each

3
ответ дан 8 December 2019 в 02:16
поделиться

Я люблю вектор. Это - каковы массивы C++ должны были быть. Я делаю большую работу в реальном времени все же. Люди, которым не нужен determinisim, могли бы предпочесть список.

Примерно все используют heck из строки.

Я не добираюсь для использования алгоритма очень, поскольку мы все еще используем VS6 здесь (который не может обработать сложный шаблон instatiations). Это скоро передаст все же.

4
ответ дан 8 December 2019 в 02:16
поделиться

Я люблю 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.
}
6
ответ дан 8 December 2019 в 02:16
поделиться

Используя вектор для замены pointer+new. Это огромно.

6
ответ дан 8 December 2019 в 02:16
поделиться

Я не могу вспомнить наличие фаворита или наиболее используемого алгоритма/предиката/итератора, просто тот, который сделал лучшее задание для того, что я пытался выполнить в то время.

2
ответ дан 8 December 2019 в 02:16
поделиться

functional материал: bind1st, bind2nd, mem_fun, equal_to, и т.д. довольно полезно, если по некоторым причинам у каждого нет доступа к Повышению, Связывают.

Это - очень субъективный вопрос, и много зависит от Вашего стиля кодирования команды, типа проекта и других неизвестных факторов.

2
ответ дан 8 December 2019 в 02:16
поделиться

Существуют не наиболее используемые алгоритмы STL, предикаты или итераторы. Это похоже на выяснение, что является наиболее используемым оператором на языке C++. Что Вы используете чаще, operator+ или operator-? Вы предпочитаете if кому: while? Или возможно к throw?

Все используется, когда это должно использоваться.

PS: Я предлагаю, чтобы Вы считали Эффективный STL Scott Meyers прежде, чем задать такие вопросы.

1
ответ дан 8 December 2019 в 02:16
поделиться

Спросите живописца, "что Ваш фаворит/больше всего использовал кисть?" :)

1
ответ дан 8 December 2019 в 02:16
поделиться

Следующее является несколько "злым", но оно сохранило нас от многих ошибок.

(Обновление, благодаря комментарию @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 дизайне.

(Не стесняйтесь указывать на профессионалов/недостатки/дефекты, я обновлю ответ.)

1
ответ дан 8 December 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: