Как стереть элементы из повышения:: ptr_vector

Необходимо перенести некоторые ограничения в предложении WHERE в предложение ON:

SELECT
    c.datefield,
    COUNT(f.booking_date) AS cnt
FROM calendar c
LEFT JOIN final_registration f
    ON c.datefield = DATE(f.booking_date) AND
       f.event_id = '101'
WHERE
    c.datefield BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01') AND CURDATE()
GROUP BY
    c.datefield;

enter image description here

[1113 ]

Демонстрация

Обратите внимание, что вы хотите сосчитать поле из таблицы final_registration, которая появляется справа от левого соединения.

Задержка в моем ответе была из-за очистки вашего запроса, чтобы удалить все ненужные вызовы на DATE_FORMAT. Вы должны иметь возможность иметь дело непосредственно с datefield. Что касается предложения WHERE, то, похоже, вам просто нужны даты, которые находятся в текущем месяце, но не позднее текущего дня месяца.

7
задан Roel 10 December 2008 в 13:17
поделиться

6 ответов

Хорошо можно сделать это со станд.:: вектор также.

В обоих случаях стирание берет итератор в качестве параметра.
Таким образом, прежде чем можно стереть что-то из вектора (или ptr_vector), необходимо определить местоположение его.

Также обратите внимание, что ptr_vector рассматривает свое содержание, как будто Вы хранили объект не указатель. Таким образом, любой поиск сделан через объект.

Так в основном

 std::vector<A>       x;
 std::ptr_vector<A>   y;

 // These two object should behave in exactly the same way.
 // The ONLY difference is inserting values which for y are pointers.
 // Y take ownership of the pointer and all subsequent acesses to the
 // members of y look like they are objects

Пример:

#include <boost/ptr_container/ptr_vector.hpp>
#include <vector>

class A
{ int m;
    public:
    A(int x):m(x)   {}
    bool operator==(A const& rhs)   {return m = rhs.m;}
};

int main()
{
    boost::ptr_vector<A>    x;
    x.push_back(new A(1));
    x.erase(std::find(x.begin(),x.end(),A(1)));


    std::vector<A>          y;
    y.push_back(A(2));
    y.erase(std::find(y.begin(),y.end(),A(2)));

    // To find an exact pointer don't modify the equality.
    // Use find_if and pass a predicate that tests for a pointer
    A* a = new A(3);
    boost:ptr_Vector<A>     z;
    z.push_back(a);
    z.erase(std::find_if(y.begin(),y.end(),CheckPointerValue(a));
}

struct CheckPointerValue
{
     CheckPointerValue(A* a):anA(a) {}
     bool operator()(A const& x)    { return &X == anA;}
     private:
        A* anA;
};
9
ответ дан 6 December 2019 в 14:11
поделиться

Я думаю, что Вы хотите назвать .release () на векторе вместо стирания. Это удаляет запись и удаляет память.

Посмотрите раздел "New Functions" для деталей в учебном руководстве или проверьте ссылку.

С другой стороны, необходимо получить итератор к элементу для вызова стирания (), я ot уверенный* количества с точки зрения ptr_vector.

3
ответ дан 6 December 2019 в 14:11
поделиться

Можно использовать шаблонный метод erase_if.

vec.erase_if( predicate() );
1
ответ дан 6 December 2019 в 14:11
поделиться

Семантика ptr_vector очень похожи на постоянного клиента vector. Необходимо найти элемент, прежде чем можно будет стереть его.

1
ответ дан 6 December 2019 в 14:11
поделиться

Любопытная вещь: STL:: вектор <> является Контейнером Произвольного доступа, означая, что он использует Итераторы Произвольного доступа.

Так vec.erase (vec.begin () +N) удалит элемент в индексе N.

Обратите внимание, что выполнение так повреждает целый мем итератора, и Вы больше не можете тривиально переключаться между векторами и списками...

1
ответ дан 6 December 2019 в 14:11
поделиться

Необходимо использовать участника erase_if метод с подходящим предикатом. Нет никакой потребности удалить указатель, контейнер имеет владение.

struct delete_a {
    bool operator()(boost::ptr_vector<A>::value_type inA) {
       return inA == a;
    }
}

vec.erase_if(delete_a());

(обратите внимание, что это - просто пример, выбранный для простоты для такой ситуации в реальном коде, я предполагаю, что можно было бы записать подходящую bind/equal_to комбинацию или лямбду использования),

Или, как альтернатива, разъединение вызова на корректном итераторе, если Вы все еще хотите использовать объект.

0
ответ дан 6 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

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