C ++ динамический вектор массива строк - PullRequest
0 голосов
/ 14 сентября 2018

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

Структура данных, которую я имею в виду, выглядит примерно так:

VECTOR: 
[0] = [str1, str2, str3]
[1] = [str1, str2, str3]
[2] = [str1, str2, str3]

Я правильно вставляюзначения в переменной res, НО мой код не работает должным образом: цикл печати выполняется 4 раза, но каждый раз печатается только элемент LAST.Я полагаю, что проблема может быть: 1) Я не помещаю массив строк в вектор должным образом;2) Я неправильно управляю итерацией по вектору и по всей строке, когда хочу напечатать.

Это мой код:

std::vector<std::string*> DatabaseConnector::ExecuteQuery(std::string query, std::vector <std::string> columns)
{
    std::vector<std::string*> results;
    std::string res[columns.size() + 1]; // last value = '\0' to signal end of array

    db_params.res = db_params.stmt->executeQuery(query);
    while (db_params.res->next()) // Access column data by alias or column name
    {
        int i = 0;
        for(std::string s : columns)
            res[i++] = db_params.res->getString(s);

        res[i] = "\0";

        results.push_back(res);
    }

    for(auto el :results)
    {
        int i=0;
        while(el[i].compare("") != 0)
             std::cout << el[i++] << " ";

        std::cout << std::endl;
    }

    return results;
};

1 Ответ

0 голосов
/ 14 сентября 2018

std::string res[columns.size() + 1]; - массив переменной длины, и вы помещаете указатель на первый элемент в векторе. Вы должны использовать std::vector<std::string> res; и std::vector<std::vector<std::string>> results;

std::vector<std::vector<std::string>> DatabaseConnector::ExecuteQuery(std::string query, const std::vector <std::string> &columns)
{
    std::vector<std::vector<std::string>> results;

    db_params.res = db_params.stmt->executeQuery(query);
    while (db_params.res->next()) // Access column data by alias or column name
    {
        std::vector<std::string> res;
        for(std::string s : columns)
            res.push_back(db_params.res->getString(s));

        results.push_back(res);
    }

    for(const auto &el :results)
    {
        for (const auto &res : el)
             std::cout << res << " ";

        std::cout << std::endl;
    }

    return results;
}
...