Если у вас есть контроль над вводом, и эти строки действительно должны представлять битовые маски, то вы, вероятно, захотите сохранить их в виде целых чисел и использовать битовые маски, как это было предложено другими. В противном случае, если вам не удастся обработать их как строки, и вы собираетесь использовать один и тот же набор строк для многократного поиска, вам все же лучше преобразовать их в интегральные битовые маски.
Если, однако, набор строк обрабатывается только один раз, вам лучше просто просмотреть набор и вручную проверить каждую из них. От руки, примерно так:
int myfunc(set<string> in, string search){
assert(search.length() <= 32);
int result = 0;
for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn)
{
bool isSubset = true;
if (iIn->length() != search.length()) // Is this guaranteed?
isSubset = false;
for (int iSearch = 0; isSubset && iSearch < search.length; ++iSearch)
if (search[iSearch] == '1' && (*iIn)[iSearch] == '0')
isSubset = false;
if (isSubset)
++result;
}
return result;
}
Или же конвертировать в длинную первую версию:
int myfunc(set<string> in, string search){
int result = 0;
long searchInteger = strtol(search.c_str(), NULL, 2);
for(set<string>::iterator iIn = in.begin(); iIn != in.end(); ++iIn)
if ((strtol(iIn->c_str(), NULL, 2) & searchInteger) == searchInteger)
++result;
return result;
}