迭代器或标准::iota与常规C++数组?

tyky79it  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(134)

有没有办法达到和这个一样的效果,

std::list<int> l(10);
std::iota(l.begin(), l.end(), -4);

用普通的int a[]
或者,以下是唯一的解决方法吗?

for (iterator itr = begin; itr != end; ++itr)
    /* ... visit *itr here ... */
kqlmhetl

kqlmhetl1#

C++11增加了std::beginstd::end。从那时起就没有区别了:

std::list<int> l(10);
std::iota(std::begin(l),std::end(l), -4);
int a[10];
std::iota(std::begin(a),std::end(a), -4);

字符串

2exbekwf

2exbekwf2#

tl;dr:用“span”将数组括起来。

@idclev463035818的answer是最简单的方法。但是,如果您希望在多个上下文中将数组视为标准库容器,请考虑将原始数组 Package 在span中,如下所示:

auto a_ = std::span{a};

字符串
span是轻量级的连续存储引用类型。它们不拥有自己的数据,所以你不需要复制数组或任何东西。你可以在这里阅读更多关于span的内容:
What is a "span" and when should I use one?
不管怎样,现在你可以写:

std::iota(a_.begin(), a_.end(), -4);
for(x : a_) { do_stuff_with(x); }
auto c = std::ranges::count_if(a_, [](auto x) { return x > 3; });

等等。也许更重要的是,数组"decays" into a pointer如果你把它传递给另一个函数,那么你就不能再在它上面使用std::begin()std::end()了; span * 可以 * 传递,所以它更健壮。
但是-std::span只出现在C++20开始的标准中。例如,在此之前,您可以在gsl-lite library中使用span实现。

相关问题