2014-01-10 2 views
2

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

Код структура, как:

typedef struct { 
    std::string UniformTypeID; 
    std::string PackageName; 
    unsigned int Version; 
} PackageInfo; 

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

Я могу использовать C++ 11.

+1

И что вы ожидаете получить результат? Bool указывает, являются ли они равными? Вектор различий? Вектор идентичных элементов? Какие? –

+1

Вы должны определить критерий, по которому будут сравниваться два элемента cectors. Достаточно определить оператор == для структуры или оператора <. –

+0

@MariusBancila Ups извините, вектор, который имеет недостающие зависимости, я имею в виду, что элементы не могут найти в установленном пакете вектор, я знаю, что забыл someting. –

ответ

1

Предоставьте предикат strict weak ordering для вашего класса PackageInfo, либо в терминах бинарного предиката, либо просто укажите operator<.

С этим вы можете сортировать свои массивы (установленные пакеты и необходимые пакеты). Затем вы можете использовать множество манипуляций функции STL:

std::vector<PackageInfo> installed_packages = ...; 
std::vector<PackageInfo> required_packages = ...; 
std::vector<PackageInfo> met_requirements; 

std::sort(installed_packages.begin(), installed_packages.end()); 
std::sort(required_packages.begin(), required_packages.end()); 

std::set_intersection(
    installed_packages.begin(), installed_packages.end(), 
    required_packages.begin(), installed_packages.end(), 
    std::back_inserter(met_requirements)); 

met_requirements теперь множество PackageInfo, который присутствует в обоих installed_pacakges и required_packages. Затем вы можете проверить, доступны ли все необходимые required_packages.

+0

Существует также «set_difference», который может быть тем, чего хочет пользователь: я не уверен в вопросе о том, как следует сравнивать два вектора, но 'set_difference' сообщает вам требуемые пакеты, которые не установлены (или, если хотите, установленные пакеты, которые не требуются), в отличие от уже установленных пакетов *. –

+0

Первоначально я думал о 'set_difference ', но могу представить себе ситуацию, когда установлены пакеты« 500 »и пакеты« 3 ». Тогда разница может быть любым числом между 497 и 500. Хотя я согласен, я делаю некоторые предположения об исходном вопросе. – Chad

+0

Действительно, все зависит от того, что хочет сделать этот вопрос. Если идея заключается в загрузке необходимых пакетов, которые не установлены, то вычислите разницу в один конец. Если идея состоит в том, чтобы мусор - собрать установленные пакеты, которые не нужны, то вычислить разницу в другую сторону. Если идея состоит в том, чтобы перечислить или проверить версию уже выполненных требований, тогда вычислите пересечение. Вы могли бы сделать все три в подходящем порядке :-) –

0

Вы можете использовать cpplinq. Конечно, это не имеет смысла, чтобы использовать его с одной операции, но если вы можете использовать его для большего количества вещей, а затем добавить заголовок cpplinq.h в свой проект, и вот как вы это делаете

std::vector<PackageInfo> installed_packages; 
std::vector<PackageInfo> required_packages; 

auto diff = from(installed_packages) 
     >> except(from(required_packages)) 
     >> to_vector(); 
+0

Кажется очень интересным, я попробую. –

Смежные вопросы