C ++中的Python中是否有与向量相似的列表切片[1:]
?我只想从矢量中获取除第一个元素以外的所有元素。
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}
答案 0 :(得分:10)
这可以使用std::vector
构造函数之一轻松完成:
v2 = std::vector<int>(v1.begin() + 1, v1.end());
答案 1 :(得分:0)
您可以按照上述答案进行操作。总是更好地了解多种方式。
int main
{
std::vector<int> v1= { 1,2,3};
std::vector<int> v2 = v1;
v2.erase( v2.begin() );
return 0;
}
答案 2 :(得分:0)
答案 3 :(得分:0)
似乎最便宜的方法是使用指向起始元素和切片中元素数量的指针。它不是真正的载体,但足以用于许多用途。
答案 4 :(得分:0)
这取决于您想要视图还是副本。
Python 对列表的切片复制了对元素的引用,因此不能简单地将其视为视图或副本。例如,
list1 = [1, 2, 3]
list2 = list1[1:]
list2[1] = 5
print(list1) # does not change, still [1, 2, 3]
list1 = [1, 2, [3]]
list2 = list1[1:]
list2[1][0] = 5
print(list1) # changes, becomes [1, 2, [5]]
有关详细信息,请参阅 this post。
DimChtz's anwer 模拟复制情况。如果你只是想要一个视图,在 C++20 中,你可以使用 ranges(除了 std::vies::drop
,std::views::take
和 std::views::counted
也很有用):
auto v2 = v1 | std::views::drop(1); // #include <ranges>
for (auto &e: v2) std::cout << e << '\n';
std::span v2{v1.begin() + 1, v1.end()}; // #include <span>
for (auto &e: v2) std::cout << e << '\n';
答案 5 :(得分: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