相关疑难解决方法(0)

为什么即将发布的Ranges库不支持某个范围内的容器初始化?

介绍

随着即将到来的Ranges库的出现,用两个迭代器来表示一个范围的需求几乎消失了。例如,代替

if (std::equal(begin(foo), end(foo), begin(bar), end(bar)))
Run Code Online (Sandbox Code Playgroud)

我们有

if (std::ranges::equal(foo, bar))
Run Code Online (Sandbox Code Playgroud)

后者之所以可以说是优越的,不仅因为它的简洁性,还因为它避免了忽略end(bar)和欢迎绑定错误的常见陷阱。

问题

下面的代码怎么样?

std::vector<int> vec{begin(foo), end(foo)};
Run Code Online (Sandbox Code Playgroud)

foo范围在哪里。使用Ranges,我希望将其简化为

std::vector<int> vec{foo};
Run Code Online (Sandbox Code Playgroud)

但是,我在[vector][container.requirements]中找不到任何提及。Ranges库也没有引入一组新的容器。

为什么Ranges库不支持范围内的容器初始化?理由是什么?

c++ iterator std c++20

3
推荐指数
1
解决办法
120
查看次数

是否可以从 C++20 中的视图构造一个 `std::span`?

此示例程序无法编译,因为transform_view无法转换为std::span

class Foo {
private:
    std::vector<std::string> strings = { "a", "b", "c" };

public:
    std::span<const char*> getStrings() {
        return strings | std::views::transform([](const std::string& str) { return str.c_str(); });
    }
};

int main() {
    Foo foo;
    auto strings = foo.getStrings();

    for (auto s : strings)
        std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我知道还不可能构造容器(如std::vector),但是我不太明白,为什么不能从中构造 a std::span。我找到了这个答案,即目前唯一可以从任意范围构建的容器是std::span,所以我希望上面的例子能够工作。

有没有办法从范围创建跨度?或者有没有其他方法可以从方法返回通用视图,而不使用auto(虚拟方法不允许)?

c++ c++20 std-span std-ranges

1
推荐指数
1
解决办法
84
查看次数

标签 统计

c++ ×2

c++20 ×2

iterator ×1

std ×1

std-ranges ×1

std-span ×1