Один из способов - использовать std::for_each
и просто искать предоставленную строку в каждой полной строке.Я бы также использовал std::vector
из std::string
для хранения строк.Пример:
#include <iostream>
#include <algorithm>
#include <vector>
const std::vector<std::string> mCodes = {
"AAD - Architecture Design",
"AAE - Architecture",
"AAI - Interior Design",
"AAL - Landscape Architecture",
"AAP - Urban Planning",
"AAS - Afro-American Studies",
"ABS - Architecture Building Science",
"ACA - Architecture Construction Mgmt",
"ACC - Accounting",
"AES - Aerospace Studies"};
std::vector<std::string> find_matches(const std::string& in) {
std::vector<std::string> rv;
// loop through all mCodes
std::for_each(mCodes.begin(), mCodes.end(),
// call lambda function for each mCode
[&](const std::string& full) {
// check if the "in" string can be found in "full"
if(full.find(in)!=std::string::npos)
// if so, save "full" to "rv"
rv.push_back(full);;
}
);
// return a vector of all found strings
return rv;
}
Альтернативой, если вы хотите использовать точное совпадение 2-4-буквенных кодов, может быть использование std::unordered_map
, когда вы делаете карту между кодами и полным названием курсов,Пример:
#include <iostream>
#include <vector>
#include <unordered_map>
const std::unordered_map<std::string, std::string> mCodes = {
{"AAD", "Architecture Design"},
{"AAE", "Architecture"},
{"AAI", "Interior Design"},
{"AAL", "Landscape Architecture"},
{"AAP", "Urban Planning"},
{"AAS", "Afro-American Studies"},
{"ABS", "Architecture Building Science"},
{"ACA", "Architecture Construction Mgmt"},
{"ACC", "Accounting"},
{"AES", "Aerospace Studies"}
};
int main(int argc, char* argv[]) {
std::vector<std::string> args(argv+1, argv+argc);
for(auto& str : args) {
auto it = mCodes.find(str);
if(it != mCodes.end()) {
std::cout << it->first << " - " << it->second << "\n";
}
}
}