加速C++;,问题5-6(将值从向量内部复制到前端) 我正在加速C++中练习,我被困在问题5-6。以下是问题描述:(略为缩写,我删除了无关信息。)

加速C++;,问题5-6(将值从向量内部复制到前端) 我正在加速C++中练习,我被困在问题5-6。以下是问题描述:(略为缩写,我删除了无关信息。),c++,vector,C++,Vector,5-6。编写提取\u失败函数,以便将通过考试的学生的记录复制到学生的开头,然后使用调整大小函数从列表中删除额外的元素 学生结束 (学生是学生结构的向量。学生结构包含单个学生的姓名和成绩。) 更具体地说,我在获取向量时遇到问题。请插入函数以正确地将经过的学生结构复制到向量学生的开头。这里是extract_fails函数,我到目前为止已经有了它(注意,它还没有按照问题描述的指示调整向量的大小;一旦我解决了当前问题,这应该是微不足道的) //从“学生”向量中提取失败的学生。 无效提取失败(向量和学生)

5-6。编写提取\u失败函数,以便将通过考试的学生的记录复制到学生的开头,然后使用调整大小函数从列表中删除额外的元素 学生结束

学生学生结构的向量。学生结构包含单个学生的姓名和成绩。)

更具体地说,我在获取向量时遇到问题。请插入函数以正确地将经过的学生结构复制到向量学生的开头。这里是extract_fails函数,我到目前为止已经有了它(注意,它还没有按照问题描述的指示调整向量的大小;一旦我解决了当前问题,这应该是微不足道的)

//从“学生”向量中提取失败的学生。
无效提取失败(向量和学生)
{
typedef向量::size_type str_sz;
typedef向量::迭代器iter;
iter it=学生。开始();
str_sz i=0,count=0;
while(it!=students.end()){
//分数测试学生是否不及格
如果(!fgrade(*it)){
//如果学生通过,复制到向量前面
插入(students.begin(),it,it);
//跟踪通过考试的学生人数(以便我们可以正确调整数组大小)
计数++;
}

cout name在向量开头插入会使指向该向量的所有迭代器无效。如果我没有弄错的话,您应该使用
-std::remove
/
std::erase
对。

我很惊讶这对您有效。我尝试使用了

students.insert(students.begin(),students[i++]);

我收到了一个坏消息。我必须使用以下格式:

students.insert(students.begin(), 1, students[i+count]);
添加的1是要插入的元素数,初始化为students[i+count]

我之所以使用I+count作为学生索引,是因为当你在开始时添加更多学生时,你必须将计数添加到索引中以弥补这一点。失败学生的索引也是如此


我现在写这篇文章更多的是为了那些在这个问题上有困难的人,我相信Darel现在已经看完这本书了!

值得注意的是,对于尝试这个问题的其他人来说,这里还有另一个问题:

insert(students.begin(), it, it)
没有在向量的开头添加任何内容,因为最后两个参数迭代器表示的范围是半开范围,这意味着从第一个迭代器开始,一直到但不包括最后一个迭代器表示的元素的范围

换句话说,由
[it,it)
表示的范围是一个空范围。要获得仅为“it”的范围,您需要
[it,it+1)


当然,这仍然存在使前面的所有迭代器无效的问题。

我没有使用,但提到在向量开头插入如何使所有迭代器无效,我想……我使用索引重写了函数:while(I!=students.size()){if(!fgrade(students[I])){students.insert(students.begin(),students[i++]);count++;}i++;}students.resize(count);现在可以了!谢谢。我在家里还有我的代码,今晚我会再看一遍,看看我的解决方案是否遗漏了一些关键的细微差别。
students.insert(students.begin(), 1, students[i+count]);
insert(students.begin(), it, it)