抱歉愚蠢的问题。我正在尝试创建并通过C ++中的常量对列表,但到目前为止在Google上找不到任何内容。理想情况下,我在for语句中也得到了第一个元素和第二个元素。
我到目前为止:
for (auto& tup : std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} }) {
}
在python中它非常简单,我可以做(甚至不需要方括号):
for tup in [('', ''), ('abc', 'cba'), ('abcd', 'dcba')]:
pass
有任何想法吗?
首先,不允许将字符串文字分配给char*
,所以无论如何你应该使用const char*
。 std::string_view
可能会更好。
使用std::tuple<char*, char*> { {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} }
,您正在尝试使用std::tuple<char*, char*>
的初始化列表构建单个std::tuple<char*, char*>
。
如果您只想查看std::tuple
s列表,可以手动重复列出该类型:
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"}
}
) { /* ... */ }
你可以使用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;
}
我不得不说,这是非常难看的。
这不应该那么复杂,只需创建一个元组数组。
并确保他们是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;
}
只需创建一个临时数组:
std::tuple<const char*, const char*> tmp[]={ {"", ""}, {"abc", "cba"}, {"abcd", "dcba"} };
for (const auto& tup : tmp) {
}
请注意,它们必须是const char*
而不是char*
。
如果您需要代码中多个位置的元组列表,请单独创建:
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";
}