C++ 删除数组中的记录 inti; int输入; cin>>输入; 对于(i=0;i列表是 int S.的原始数组。 List.RemoveAt(i--); List.DeleteAt(i--); #包括//std::remove()所在的位置 #include//std::distance()驻留的位置(严格来说不需要) 结构坏蛋{ 坏人(int Bad):坏人{(Bad){} 布尔运算符()(常量元素和元素)常量{ return Elem.PersonID==Bad; } }; // ... int*NewEnd=std::remove_if(列表,列表+列表长度,坏人); //列表现在有了一个新的结尾,因为元素被“删除”。 //但它们并没有真正被移除;数组仍然具有相同的固定大小。 int ListLength=std::distance(列表,NewEnd);

C++ 删除数组中的记录 inti; int输入; cin>>输入; 对于(i=0;i列表是 int S.的原始数组。 List.RemoveAt(i--); List.DeleteAt(i--); #包括//std::remove()所在的位置 #include//std::distance()驻留的位置(严格来说不需要) 结构坏蛋{ 坏人(int Bad):坏人{(Bad){} 布尔运算符()(常量元素和元素)常量{ return Elem.PersonID==Bad; } }; // ... int*NewEnd=std::remove_if(列表,列表+列表长度,坏人); //列表现在有了一个新的结尾,因为元素被“删除”。 //但它们并没有真正被移除;数组仍然具有相同的固定大小。 int ListLength=std::distance(列表,NewEnd);,c++,C++,我试图创建一个函数,根据提供的id输入从数组中删除一条记录。除此之外,我不知道该怎么办。删除记录后,是否还需要移动数组中的值?我不知道列表的类型。 但你应该做这样的事情: int i; int Input; cin >> Input; for(i = 0; i < Size ; i ++ ) if (List[i].PersonID == Input) { } 在函数被调用后,i将减小i 如果使用标准容器,则不需要移动数组中的任何值。 如果你负责数组,那么你需要

我试图创建一个函数,根据提供的id输入从数组中删除一条记录。除此之外,我不知道该怎么办。删除记录后,是否还需要移动数组中的值?

我不知道列表的类型。 但你应该做这样的事情:

int i;
int Input;

cin >> Input;

 for(i = 0; i < Size ; i ++ )
  if (List[i].PersonID == Input) {

 }
在函数被调用后,i将减小i

如果使用标准容器,则不需要移动数组中的任何值。 如果你负责数组,那么你需要改变你的值

**编辑


下面是对标准容器的介绍。如果您正在管理自己的动态数组,则应该考虑使用这些数组。

这里,假设“代码>列表是<代码> int S.

的原始数组。
List.RemoveAt(i--);
List.DeleteAt(i--);
#包括//std::remove()所在的位置
#include//std::distance()驻留的位置(严格来说不需要)
结构坏蛋{
坏人(int Bad):坏人{(Bad){}
布尔运算符()(常量元素和元素)常量{
return Elem.PersonID==Bad;
}
};
// ...
int*NewEnd=std::remove_if(列表,列表+列表长度,坏人);
//列表现在有了一个新的结尾,因为元素被“删除”。
//但它们并没有真正被移除;数组仍然具有相同的固定大小。
int ListLength=std::distance(列表,NewEnd);

我认为从数组/向量中删除元素的最佳方法是使用复制方法,例如:

#include<algorithm>  // where std::remove() resides
#include<iterator>   // where std::distance() resides (not strictly necessary)

struct BadPerson {
    BadPerson(int Bad) : Bad_(Bad) { }
    bool operator()(const Element& Elem) const {
        return Elem.PersonID == Bad_;
    }
};

// ...
int *NewEnd = std::remove_if(List, List + ListLength, BadPerson);

// the list now has a new end, because elements were "removed".
// but they weren't really removed; the array still has the same fixed size.
int ListLength = std::distance(List, NewEnd);
int write_ptr=0;
for(int read_ptr=0;read_ptr
这将允许仅通过一个过程就删除多个元素

标准库将此方法包括为
std::remove_if
,但是在C++0X到达之前,由于语言的限制,使用它很烦人(能够指定测试的代码很容易变得非常难看)。

int i;
int输入;
cin>>输入;
对于(i=0;i对于(iTJ= i;Ji努力维护变量命名约定。但是,天哪,它伤害了我的手指。):-<代码> STD::RelvivIF如果代码/ C++方法可能会在我们用C++ 0x获得LAMBDAS时至少部分消失。与模板一起使用:-(.它并不难看。它缺少代码的局部性,但它并不难看。在使用循环(和条件!)和减少代码的局部性之间,我选择标准算法。毫不犹豫。此外,我认为
std::remove_if()如果我选择了一个好的函数名,它也会被折叠成一行代码。这只是为了说明<代码> STD::ReaveVII:I/CONT>的缺点不是你的错:你做的最好的是用C++和 <代码>,IMO仍然因为C++的缺乏表现力而被吸吮。uage。创建一个顶级类只是为了能够指定一个测试,这在我看来是荒谬的,生成的代码将更难阅读,因为测试将脱离上下文。“代码的局部性”是一件重要的事情,并且是使用类的主要好处之一!…C++0X能够以
[=]的形式传递代码(Person&p){return p.id==id;}
将使这种方法变得合理。什么是
DeleteAt
RemoveAt
List
很可能不是
int
,而是
int
的容器,它是什么具体类型的?看起来
List
是一个用户定义的类。更大的问题是它是否是一个指针?OP可以简单地设置它只要内存被释放,就可以设置为NULL。如果他想调整数组的大小(或者简单地降低大小),这有点不同(要调整大小,列表需要动态分配)。在不了解上下文的情况下,很难给出任何具体的方向。当声明性方法比显式代码更难阅读时,IMO最好使用显式代码。循环本身并不坏……但如果有更好的替代方法(例如python列表理解),使用循环当然是愚蠢的“代码> STD::ReaveIVI/Eng>不是你的错,只是缺少C++的表达能力。STL算法是很可怕的,因为在C++中,不可能以合理的方式传递代码,例如,你必须创建一个顶级类来指定一个测试……很明显,这个不能缩放。C++ +0x希望修复这个问题。兰博达斯。
int write_ptr = 0;
for (int read_ptr=0; read_ptr < n; read_ptr++)
{
    if (... keep element array[write_ptr] ? ...)
    {
        if (read_ptr != write_ptr)
            array[write_ptr] = array[read_ptr];
        write_ptr++;
    }
}
// The new size of the array is write_ptr
int i;

int Input;

cin >> Input;

 for(i = 0; i < Size ; i ++ )
 {
   if (List[i].PersonID == Input)
   {
    for(int j=i;j<size-1;j++)
    {
     List[j]=List[j+1];
    }
 }
 }