Просматривая постоянный список кортежей в C ++ - PullRequest
0 голосов
/ 26 февраля 2019

Извините за глупый вопрос.Я пытаюсь создать и просмотреть постоянный список пар в C ++, но пока ничего не нашел в Google.В идеале я получаю первый и второй элементы тоже в операторе for.

У меня пока есть:

for (auto& tup : std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} }) {

}

В Python это действительно просто, и я могу просто сделать (даже ненужны квадратные скобки):

for tup in [('', ''), ('abc', 'cba'), ('abcd', 'dcba')]:
    pass

есть идеи?

Ответы [ 5 ]

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

Если вам нужен список кортежей в нескольких местах в вашем коде, создайте его отдельно:

constexpr std::tuple<std::string_view, std::string_view> the_list[] = {
    {"", ""}, {"abc", "cba"}, {"abcd", "dcba"}
};

Тогда использовать его будет просто:

for (auto& [one,two] : the_list) {
    std::cout << one << " , " << two << "\n";
}

Если этотолько будет использоваться в одном цикле, вы можете использовать список инициализаторов напрямую:

for (auto& [one,two] : std::initializer_list<std::tuple<std::string_view, std::string_view>>
    {
        {"", ""}, {"abc", "cba"}, {"abcd", "dcba"}
    }
) {
    std::cout << one << " , " << two << "\n";
}
0 голосов
/ 26 февраля 2019

Это не должно быть так сложно, просто создайте массив кортежей.

И убедитесь, что они const char* не char*:

#include <iostream>
#include <tuple>

int main() {

    std::pair<const char*, const char*> a[] =  { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} };

    for (auto& tup : a) {
        std::cout << std::get<0>(tup) << " " << std::get<1>(tup);
    }

    return 0;
}
0 голосов
/ 26 февраля 2019

Просто создайте временный массив до:

std::tuple<const char*, const char*> tmp[]={ {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} };

for (const auto& tup : tmp) {

}

Обратите внимание, что они должны быть const char*, а не char*.

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

Прежде всего, строковый литерал не может быть назначен на char*, поэтому вы все равно должны использовать const char*.std::string_view может быть лучше.

С std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} } вы пытаетесь создать single std::tuple<char*, char*> со списком инициализаторов для std::tuple<char*, char*>.

Если вы хотите просто просмотреть список std::tuple с, вы можете вручную перечислить тип вручную:

for (auto&& tup : { std::tuple<const char*, const char*>{"", ""},
                    std::tuple<const char*, const char*>{"abc", "cba"},
                    std::tuple<const char*, const char*>{"abcd", "dcba"} }) {
    /* ... */
}

Где, в основном, создается std::initializer_list<std::tuple<char*, char*>>, ипрошлоЕсли вы считаете, что это слишком уродливо, вы также можете указать тип только один раз:

for (auto&& x : std::initializer_list<std::tuple<const char*, const char*>>
    {
        {"a1", "a2"},
        {"b1", "b2"}
    }
) { /* ... */ }
0 голосов
/ 26 февраля 2019

Вы можете использовать std::initializer_list:

for (auto& tup : std::initializer_list<std::tuple<const char*, const char*>> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} })
{
    std::cout << std::get<0>(tup) << ", " << std::get<1>(tup) << std::endl;
}

https://godbolt.org/z/LuuTuH

Это довольно уродливо читать, я должен сказать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...