在C ++中浏览一个常量的元组列表

问题描述 投票:0回答:5

抱歉愚蠢的问题。我正在尝试创建并通过C ++中的常量对列表,但到目前为止在Google上找不到任何内容。理想情况下,我在for语句中也得到了第一个元素和第二个元素。

我到目前为止:

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

}

在python中它非常简单,我可以做(甚至不需要方括号):

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

有任何想法吗?

c++ list stl tuples
5个回答
4
投票

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

使用std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} },您正在尝试使用std::tuple<char*, char*>的初始化列表构建单个std::tuple<char*, char*>

如果您只想查看std::tuples列表,可以手动重复列出该类型:

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"}
    }
) { /* ... */ }

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
投票

这不应该那么复杂,只需创建一个元组数组。

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

1
投票

只需创建一个临时数组:

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

for (const auto& tup : tmp) {

}

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


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";
}
© www.soinside.com 2019 - 2024. All rights reserved.