Найти строку в списке строк, а затем установить строку для найденной строки? - PullRequest
0 голосов
/ 25 февраля 2019

C ++ программирование

Итак, у меня есть список строк

static const 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"};

У меня есть пользователь, определяющий studentMajor как строку из 2-4 символов, используя основной код студента (т.е. studentMajor = ACC)

Мне нужно выполнить поиск в списке строк, и если он находит ACC в этом списке строк, он устанавливает studentMajor на полную строку, в которой был найден ACC.

if( student variable is found ) then
    studentVariable = "ACC - Accounting"
else
    error, improper student major entered

Я предполагаю, что мне нужно использовать std :: find, но я не уверен, как найти «ACC» в этом списке, а затем взять полную строку «ACC», присоединенную к ней, и сохранить ее впеременная.

Я думаю, что это простая манипуляция с std :: string :: find и std :: string :: substr, но я совсем не уверен, как с этим справиться.

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Я решил это, пропустив цикл for.

for(int i = 0; i < 221; i++){
    if(mCodes[i].find(testMajor) == string::npos){
        testMajor = mCodes[i];
        return testMajor;
    }
}

Где 221 - полный размер массива mCodes.Это просто вручную ищет каждый элемент mCodes, и если поиск возвращается положительным, установите testMajor на этот элемент массива:)

Спасибо y'all

0 голосов
/ 25 февраля 2019

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

#include <iostream>
#include <string>
#include <map>

static const 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()
{
    std::map<std::string, std::string> course_map;

    for(auto const& course: mCodes) {
        std::string code = course.substr(0, course.find(" "));
        course_map.insert(std::pair<std::string, std::string>(code, course));
    }

    if(course_map.find("ACC") != course_map.end() ) {
        std::cout << "course is " << course_map["ACC"] << std::endl;
    } else {
        std::cout << "ACC not found." << std::endl;
    }
    return 0;
}
0 голосов
/ 25 февраля 2019

Один из способов - использовать 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";
        }
    }
}
...