2010-06-07 2 views
0

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

Скажем, на триггере вы получаете значения.

First trigger: You get 1 
Second trigger: You get 1, 2 
Third trigger: You get 1, 2, 3 

Итак, я храню 1. Для 2-го триггера, я храню 2 с 1 уже существует. Для 3-го триггера, я храню 3, так как 1,2 уже существует

так в общей сложности я хранится 1,2,3

Как вы можете видеть, мы можем легко проверить новые значения, если старый! = новый.

Вот приходят проблемы:

Fourth trigger: You get 1, 2, 4 

Для 4-го триггера, я храню 1, 2, потому что существует , но как я могу проверить на 3 и удалить 3 из магазина и проверить, если 4 нового?

Если у вас возникли проблемы с пониманием этого, не стесняйтесь уточнять. Благодаря!

+1

Непонятно, о чем вы просите. Что вы подразумеваете под «триггером» и «магазином»? – VeeArr

+1

Я тоже смущен тем, что вы просите.Если вас интересуют только значения, полученные из «триггера», почему бы не просто сохранить новые значения и выбросить старые? Время, необходимое для перераспределения памяти, не будет проблемой, поскольку, например, std :: vector будет повторно использовать ранее выделенную память. –

+1

Для второго триггера вы игнорируете существующие значения, но для 4-го триггера вы этого не делаете. Что вы на самом деле пытаетесь сделать? – Bill

ответ

1

Используйте контейнер std::set<int>. Когда появляется триггер, очистите его, вставьте все значения из триггера. Это должно быть нормально, если вы работаете с несколькими номерами (около десяти или около того). С большим количеством может потребоваться немного более сложный подход.

0

Ваша логика изменяется между 1,2,3 и 1,2,4 (хранится только 3 на первой, но хранится 1,2,4 на последней)

В этом случае, игнорировать данные recv'd который уже существует, только сохранение новых данных, если не были отправлены старые данные, и в этом случае вы создадите новый набор данных для хранения.

Но я предполагаю, что это не то, что вы имели в виду вообще :)

редактировать
Я вижу, что это было отредактировано в настоящее время, так что мой ответ неверен

редактировать-2
Самый быстрый способ - отбросить все сохраненные данные на каждой итерации, так как сравнения будут длиться (если не дольше), чем полное сохранение отправленных данных.

1

Трудно сказать, что именно вы запрашиваете, но см. Структуру данных std::set, если ваша основная проблема заключается в том, чтобы поддерживать набор уникальных номеров и эффективно проверять существование в наборе.

0

Ваш подход звучит так, как будто его лучше обслуживать с помощью некоторой базовой теории множеств. Несколько ответов уже указывают на установки STL. При этом вам потребуется выполнить итерацию по сообщенным значениям, чтобы проверить членство в наборе.

Однако есть ли возможность повлиять на то, что сообщается с каждым «триггером»? Например, если это что-то вроде выборочного опроса, вы можете просто поставить все, что вы хотите, чтобы вы проводили опрос в другое состояние, чтобы оно не сообщалось как готовое в последующих триггерах.