gpt4 book ai didi

c++ - 从 C 字符串数组创建 string_views 的范围

转载 作者:行者123 更新时间:2023-12-03 06:50:09 25 4
gpt4 key购买 nike

给定一些函数 void func(std::span<std::string_view>) ,如何为这个函数提供一个原始的 C 字符串数组 const char**以最有效的方式?
据我所知,这应该是可能的,无需任何复制,如 std::string_view可以从 C 字符串和 std::span 构造可以从指针+大小构造。但是,我似乎无法弄清楚正确的语法。
这是一些在创建 std::vector<std::string_view> 时起作用的最小代码通过迭代字符串数组中的每个字符串:

#include <iostream>
#include <string>
#include <span>
#include <vector>

static void func(std::span<std::string_view> strings)
{
// Just print the strings...
std::cout << "strings:\n";
for (const auto& str : strings)
std::cout << str << "\n";
std::cout << std::endl;
}

int main()
{
// Raw C string array
const char* raw_strings[3] = {
"This is a string",
"This is also a string",
"And then another string"
};

#if 1
// This works
std::vector<std::string_view> s;
for (std::size_t i = 0; i < 3; i++)
s.push_back( std::string_view{ raw_strings[i] } );
#else
// This does not work
std::span<std::string_view> s{ raw_strings, (std::size_t)3 };
#endif

func(s);
}
这是完成繁重工作的coliru链接: https://coliru.stacked-crooked.com/a/cb8fb8ebbc962d45

最佳答案

如果您考虑一下,要执行您所要求的操作,编译器需要找到存储 3 std::string_view 的地方。 s 并且没有这样的地方,因为 std::span实际上并没有为其引用的元素分配任何存储空间。
所以,AFAICS,没有直接的方法可以做到这一点。

编辑:我认为这是最便宜的方法,因为它不涉及免费商店的分配。但是,请注意,在使用 span 时数组不会超出范围:

std::array <std::string_view, sizeof (raw_strings) / sizeof (raw_strings [0])> sa;
std::copy (std::begin (raw_strings), std::end (raw_strings), std::begin (sa));
std::span <std::string_view> s { sa };

关于c++ - 从 C 字符串数组创建 string_views 的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64036830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com