最近我有建议span<T>在我的代码中使用's,或者在网站上看到了一些使用span's - 应该是某种容器的答案.但是 - 我在C++标准库中找不到类似的东西.
那么这个神秘的是什么span<T>,以及为什么(或什么时候)使用它是一个好主意,如果它是非标准的?
在最近的几次会议演示中,我听说Bjarne Stroustrup和其他人提到了C++的新编码指南以及支持它们的一些类型.
具体来说,我记得一个例子,span<T>而不是(T* p, int n)作为一个函数的参数(在约32:00进入谈话时); 但我也记得使用的建议array_view<T>.它们是两个替代方案但是相同的概念吗?或者我是否混淆了事情,他们实际上并没有那么相关?
我似乎无法找到任何关于它们应该是什么的权威定义.
c++ array-view cpp-core-guidelines guideline-support-library
假设我有一个值为[1,2,3,4,5,6,7,8,9,10]的向量.我想创建一个新的向量,例如,[5,6,7,8].我想这只是用指针创建一个向量的问题,还是我需要push_back所需的所有中间值?
[1:]在C++中有没有相当于Python 的列表切片与向量?我只想从矢量中获取除第一个元素之外的所有元素.
Python的列表切片运算符:
list1 = [1, 2, 3]
list2 = list1[1:]
print(list2) # [2, 3]
Run Code Online (Sandbox Code Playgroud)
C++期望的结果:
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2;
v2 = v1[1:];
std::cout << v2 << std::endl; //{2, 3}
Run Code Online (Sandbox Code Playgroud) 我创建了一个矢量:
std::vector<std::string> mero; // earlier it filled with more than 500 data
Run Code Online (Sandbox Code Playgroud)
之后我想创建另一个向量,它只占用向量的一部分mero.(例如:从第100到第250)
我想看看是否可以将部分向量传递给函数,使其显示为函数的法线向量.更重要的是,我希望在O(1),恒定时间内完成.我不想迭代向量来创建一个新的向量.实际上,我还希望在以下示例中将新矢量的大小更改为40.
void func(vector <int> &v){
//calling index 10 to 50 of v
func(v[10..50])
}
Run Code Online (Sandbox Code Playgroud) 在我的C++项目中,我使用a vector来保存一堆structs,其中包含一些简单游戏的元素(即:tic-tac-toe,coordinates,xvs o等).即:
struct gameMove
{
int x;
int y;
int player;
int order;
};
Run Code Online (Sandbox Code Playgroud)
每次在单个游戏中,无论何时玩家进行移动(即:放置x或移动o),信息都存储在vector通道中push_back(),以创建"撤消"功能,该功能目前按预期工作.
在我的撤销/重做逻辑的某些部分,我使用的函数遍历vector,找到适当的元素,并直接返回指向该元素的指针.
它是否安全,只要我正确管理vector,访问它,将指向元素的所有指针清空vector,或者存在固有风险?我担心的是,如果扩展我计划做的游戏(即:对我正在进行的国际象棋游戏使用相同的代码),并且vector太大而需要自动重新分配,指针将会变得无效(即:整个列表被移动到一个可以适合所有元素的新的连续块),或者是否有某种类型的智能指针接口vector来完成同样的事情?
谢谢.
一个简单的任务,但我不记得C++的语法.
int array[n];
Run Code Online (Sandbox Code Playgroud)
我需要获取数组的最后5个对象.
array.slice(array.length - 5, 1)??
Run Code Online (Sandbox Code Playgroud) 当我遇到不一致的程序行为时,我试图通过定义非常通用的mergesort算法来练习C ++迭代器。我的问题不是如何实现mergesort(我都知道并且也意识到有很多示例答案),而是当使用迭代器创建递归向量时会收到不一致的最终结果。
我知道可以通过for循环将值复制到L和R数组中来解决问题,但是我想了解为什么使用迭代器无法正常工作。这是在带有C ++ 14的CLION上运行。此帖子从向量中提取子向量的最佳方法?没有回答我的问题,因为我正在创建类似于规定方法的向量。
void merge2(vector<int> &arr, int l, int m, int r)
{
vector<int> L{arr.begin()+l, arr.begin()+m+1};
vector<int> R{arr.begin()+m+1,arr.begin()+r+1};
int i = 0, j = 0, k = l;
int n1 = m - l + 1;
int n2 = r - m;
while (i < (n1) && j < (n2)){
if (L[i]<=R[i]){ //R[i] is replaced by R[j]
arr[k] = L[i++];
}
else {
arr[k] = R[j++];
}
k++;
}
while (i < n1)
{
arr[k] = …Run Code Online (Sandbox Code Playgroud) 我有2个向量,其中一个有vec1 {e1,e2,e3,e4},另一个有vec2 {e2,e4,e5,e7}
如何从上面的向量中有效地获得三个向量,使得1.has元素仅在vec1中可用类似2只有vec2元素和3.with common elements
提取部分向量的最佳方法是哪种?如果我有
std::vector<int> v1(9);
for(int i = 0; i < 9; i++)
v1[i] = i + 1;
Run Code Online (Sandbox Code Playgroud)
我需要一个放入的代码
std::vector<int> v2(2);
Run Code Online (Sandbox Code Playgroud)
v1的第二和第三个元素.我必须做一个循环还是有一种最聪明的方法?
我正在尝试使用带有以下代码的迭代器从 int 的另一个子向量中提取 int 的子向量:
std::vector<int> Original;
std::vector<int> NewVec;
NewVec(Original.begin(), Original.begin()+5);
这不起作用,只有当我在相同的提取行中声明 NewVec 时:
std::vector<int> NewVec(Original.begin(), Original.begin()+5);
那么,是否可以使用 NewVec 使其声明在其构造之前?谢谢。