【问题标题】:How to "cut" vector in c++ like python syntax [duplicate]如何像python语法一样在c ++中“剪切”向量[重复]
【发布时间】:2021-09-24 20:10:10
【问题描述】:

在 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";

我试图找到这个问题的语法,但还没有找到任何东西。

【问题讨论】:

  • 不要描述 Python 语法,而是描述你想要的结果。
  • 你可以这样做:for(auto i : std::vector(v.begin() + 2, v.end()))
  • 我不知道 python,但是如果你想查看数组中特定范围的元素,你可以使用迭代器并将它们递增 n 或 k。 std::vector&lt;int&gt; v = {0, 1, 2, 3, 4, 5, 6}; 那么你可以,比如说,只循环遍历元素 2 到 4。for(auto it = v.begin() + 2; it != v.begin() + 4; ++it) {}
  • Python 不是 C++。在编写 C++ 代码时不要使用 Python 技术,否则你的 C++ 代码会出现错误、效率低下、内存泄漏,或者对于 C++ 程序员来说看起来很奇怪。

标签: c++ c++11 vector iterable


【解决方案1】:

在 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(&amp;v[2], &amp;v[5])std::span(&amp;v[2], &amp;v[5]) 也是有效的,但我需要有人确认。

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2015-11-05
    • 1970-01-01
    • 2018-04-10
    • 2021-07-28
    相关资源
    最近更新 更多