在 C 中切片向量

新手上路,请多包涵

是否有等效的列表切片 [1:] 来自 Python 中的 C++ 向量?我只是想从向量中获取除第一个元素之外的所有元素。

Python的列表切片运算符:

 list1 = [1, 2, 3]
list2 = list1[1:]

print(list2) # [2, 3]

C++ 期望的结果:

 std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2;
v2 = v1[1:];

std::cout << v2 << std::endl;  //{2, 3}

原文由 Wizard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 698
2 个回答

这可以使用 std::vector 的复制构造函数轻松完成:

 v2 = std::vector<int>(v1.begin() + 1, v1.end());

原文由 DimChtz 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 C++20 中,这很容易:

 #include <span>
#include <vector>
#include <iostream>

template<int left = 0, int right = 0, typename T>
constexpr auto slice(T&& container)
{
    if constexpr (right > 0)
    {
        return std::span(begin(std::forward<T>(container))+left, begin(std::forward<T>(container))+right);
    }
    else
    {
        return std::span(begin(std::forward<T>(container))+left, end(std::forward<T>(container))+right);
    }
}

int main()
{
    std::vector v{1,2,3,4,5,6,7,8,9};

    std::cout << "-------------------" << std::endl;
    auto v0 = slice<1,0>(v);
    for (auto i : v0)
    {
        std::cout << i << std::endl;
    }

    std::cout << "-------------------" << std::endl;
    auto v1 = slice<0,-1>(v);
    for (auto i : v1)
    {
        std::cout << i << std::endl;
    }

    std::cout << "-------------------" << std::endl;
    auto v2 = slice<1,3>(v);
    for (auto i : v2)
    {
        std::cout << i << std::endl;
    }

    std::cout << "-------------------" << std::endl;
    auto v3 = slice<1,-1>(v);
    for (auto i : v3)
    {
        std::cout << i << std::endl;
    }

    std::cout << "-------------------" << std::endl;
    auto v4 = slice<3,3>(v);
    for (auto i : v4)
    {
        std::cout << i << std::endl;
    }

}

结果:

 Program returned: 0
-------------------
2
3
4
5
6
7
8
9
-------------------
1
2
3
4
5
6
7
8
-------------------
2
3
-------------------
2
3
4
5
6
7
8
-------------------

您还可以添加边界检查和其他情况,例如负左索引等……但这只是一个示例。

在编译器资源管理器中运行: https ://godbolt.org/z/qeaxvjdbj

原文由 mnesarco 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏