有没有办法达到和这个一样的效果,
std::list<int> l(10); std::iota(l.begin(), l.end(), -4);
用普通的int a[]?或者,以下是唯一的解决方法吗?
int a[]
for (iterator itr = begin; itr != end; ++itr) /* ... visit *itr here ... */
kqlmhetl1#
C++11增加了std::begin和std::end。从那时起就没有区别了:
std::begin
std::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);
字符串
2exbekwf2#
@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实现。
std::begin()
std::end()
std::span
2条答案
按热度按时间kqlmhetl1#
C++11增加了
std::begin
和std::end
。从那时起就没有区别了:字符串
2exbekwf2#
tl;dr:用“span”将数组括起来。
@idclev463035818的answer是最简单的方法。但是,如果您希望在多个上下文中将数组视为标准库容器,请考虑将原始数组 Package 在span中,如下所示:
字符串
span是轻量级的连续存储引用类型。它们不拥有自己的数据,所以你不需要复制数组或任何东西。你可以在这里阅读更多关于span的内容:
What is a "span" and when should I use one?
不管怎样,现在你可以写:
等等。也许更重要的是,数组"decays" into a pointer如果你把它传递给另一个函数,那么你就不能再在它上面使用
std::begin()
和std::end()
了; span * 可以 * 传递,所以它更健壮。但是-
std::span
只出现在C++20开始的标准中。例如,在此之前,您可以在gsl-lite library中使用span实现。