std :: vector удаляя элементы, которые удовлетворяют некоторым условиям

Как видно из заголовка, я хочу удалить / объединить объекты в векторе, которые удовлетворяют определенным условиям. Я имею в виду, я знаю, как удалить целые числа из вектора, который имеет значение, например, 99.

Идиома удаления Скотта Мейерса:

vector v;
v.erase(remove(v.begin(), v.end(), 99), v.end());

Но предположим, что есть вектор объектов, который содержит переменную-член задержки. И теперь я хочу исключить все объекты, задержка которых отличается только меньшим, чем определенный порог, и хочу объединить / объединить их в один объект.

Результатом процесса должен быть вектор объектов, где разность всех задержек должна быть не менее указанного порога.

 Bartek Banachewicz24 июн. 2013 г., 10:40
@Christoph Задержки отсортированы?
 Bartek Banachewicz24 июн. 2013 г., 10:35
@Christoph, если вы хотите принять во внимание более одного значения,remove_if может быть трудно использовать
 antibus24 июн. 2013 г., 10:41
@BartekBanachewicz: да, они отсортированы.
 antibus24 июн. 2013 г., 10:38
@Bartek Banachewicz: Да, это так. Я хочу сравнить по задержке со всеми остальными.
 BoBTFish24 июн. 2013 г., 10:17
 ForEveR24 июн. 2013 г., 10:17
Используйте. "remove_if
 Benjamin Lindley24 июн. 2013 г., 10:38
@Christoph: И как бы вы хотели справиться с этой ситуацией:diff(o1,o2) < threshold а такжеdiff(o2,o3) < threshold ноdiff(o1,o3) > threshold
 antibus24 июн. 2013 г., 10:40
@ Бенджамин Линдли: Выверно. Это может привести к вырождению вектора на один объект в худшем случае. Может быть, я должен думать об этом немного больше.
 stijn24 июн. 2013 г., 10:27
 Benjamin Lindley24 июн. 2013 г., 10:20
Я хочу исключить все объекты, задержки которых отличаются только меньше определенного порога » - Не могли бы вы уточнить это? Отличается от чего? Другие элементы в контейнере? Ближайшие элементы? Какое-то конкретное значение?
 antibus24 июн. 2013 г., 10:30
Предположим, вектор содержит несколько объектов, объектo1 и объектo2 которые имеют задержкуo1.delay=10 а такжеo2.delay=50таким образом, они имеют относительную задержку 40. Эта разница задержки слишком мала, чтобы ее можно было принять во внимание, поэтому я хочу рассмотретьo1 а такжеo2 как один объект вместо двух отдельных объектов.

Ответы на вопрос(2)

Решение Вопроса

std::remove_if приходит на помощь!

99 будет заменен наUnaryPredicate это отфильтровывает ваши задержки, для которых я собираюсь использовать лямбда-функцию.

И здесь'Вот пример:

v.erase(std::remove_if(
    v.begin(), v.end(),
    [](const int& x) { 
        return x > 10; // put your condition here
    }), v.end());
 Bartek Banachewicz11 окт. 2015 г., 15:10
@ user1436187 что?
 user143618711 окт. 2015 г., 16:44
Условие не может быть переменным. Например, поставить максимум вместо 10.
 user143618711 окт. 2015 г., 15:04
10 должно быть жестко закодировано!
 Bartek Banachewicz12 окт. 2015 г., 12:15
@ user1436187 это должно быть из внешней области видимости. Определить доv.erase() позвоните и перейдите к лямбде внутри[]
 user143618712 окт. 2015 г., 07:34
Было бы здорово, если бы вы объяснили, как мы можем сделать что-то вроде этого:v.erase(std::remove_if( v.begin(), v.end(), [](const int& x, int max) { return x > max; // put your condition here }), v.end());
 Bartek Banachewicz12 окт. 2015 г., 00:04
@ user1436187 ну почему бы и нет?

v.erase(remove_if(
            v.begin(), v.end(), bind(greater<int>(), _1, 99)),
        v.end());
</int>
 Bartek Banachewicz24 июн. 2013 г., 10:39
трусливыйbind+1 для этого одного.
 James Kanze24 июн. 2013 г., 10:51
@BenjaminLindley Согласен. С другой стороны, если вы неесть C ++ 11,boost::bind все еще полезно.
 Benjamin Lindley24 июн. 2013 г., 10:49
Лично я нахожу лямбдыbind в основном устарел. Oни'гораздо более в целом полезно, и даже в таких простых случаях, как это, гдеbind сработало бы, лямбда гораздо проще как понять, так и запомнить синтаксис для.

Ваш ответ на вопрос