通过C ++中的元组常量列表

时间:2019-02-26 10:51:05

标签: c++ list stl tuples

对不起,愚蠢的问题。我正在尝试在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 :(得分:4)

首先,不允许将字符串文字分配给char*,因此无论如何都应使用const char*std::string_view可能更好。

使用std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} },您正在尝试使用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"}
    }
) { /* ... */ }

答案 1 :(得分:2)

您可以使用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

我不得不说,这很难看。

答案 2 :(得分:2)

这应该没有那么复杂,只需创建一个元组数组即可。

并确保它们是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;
}

答案 3 :(得分:1)

只需在以下位置创建一个临时数组:

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

for (const auto& tup : tmp) {

}

请注意,它们必须为const char*,而不是char*

答案 4 :(得分:0)

如果在代码中多个地方需要元组列表,请分别创建它:

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