如何在 C++ 中使用 "cut" 向量,如 python 语法
How to "cut" vector in c++ like python syntax
在 python 中,如果我有一些可迭代对象,我可以这样做吗:
v = v[n:k] //
for i in v[3:]:
"do something"
现在在 C++ 中我想要这样:
vector<int> v = {1,2,3,4,5,6,7,8}
v = v[3:5];
或者像这样:
for(auto n: v[2:end])
"do something";
我试图找到这个问题的语法,但还没有找到任何东西。
在 C++20 之前,您始终可以:
for(auto i : std::vector(v.begin() + 2, v.begin() + 5))
{
foo(i);
}
但是不推荐这样做,因为它会通过复制所有需要的元素来创建一个新的 vector
。最好只做一个基于 for 循环的迭代器:
for(auto it = v.begin() + 2; it != v.begin() + 5; ++it)
{
foo(*it);
}
// or
for(size_t index = 2; index != 5; ++index)
{
foo(v[index]);
}
随着 C++20 引入 span
,您可以:
for(auto i : std::span(v.begin() + 2, v.begin() + 5))
{
foo(i);
}
它使用与第一个相同的语法,不需要复制元素。
另外我认为std::vector(&v[2], &v[5])
和std::span(&v[2], &v[5])
也是有效的,但我需要有人确认。
在 python 中,如果我有一些可迭代对象,我可以这样做吗:
v = v[n:k] //
for i in v[3:]:
"do something"
现在在 C++ 中我想要这样:
vector<int> v = {1,2,3,4,5,6,7,8}
v = v[3:5];
或者像这样:
for(auto n: v[2:end])
"do something";
我试图找到这个问题的语法,但还没有找到任何东西。
在 C++20 之前,您始终可以:
for(auto i : std::vector(v.begin() + 2, v.begin() + 5))
{
foo(i);
}
但是不推荐这样做,因为它会通过复制所有需要的元素来创建一个新的 vector
。最好只做一个基于 for 循环的迭代器:
for(auto it = v.begin() + 2; it != v.begin() + 5; ++it)
{
foo(*it);
}
// or
for(size_t index = 2; index != 5; ++index)
{
foo(v[index]);
}
随着 C++20 引入 span
,您可以:
for(auto i : std::span(v.begin() + 2, v.begin() + 5))
{
foo(i);
}
它使用与第一个相同的语法,不需要复制元素。
另外我认为std::vector(&v[2], &v[5])
和std::span(&v[2], &v[5])
也是有效的,但我需要有人确认。