删除数组中的某几个元素

需求描述

  1. 给定结构体如下:
typedef struct {
    int x;
    int y;
} Point;

typedef struct {
    Point point;
    int Times;
} CCPoints;
  1. 现有数组A CCPoints10个,数组B Point3个
  2. 需要将A中包含B中点的去除

解决思路1:

主要逻辑代码如下:

  1. 第一个for遍历B数组所有元素
  2. 第二个for遍历A数组,如果不满足相等条件,那么覆盖,如果满足则计数
  3. 最后的数组有效元素为原数组长度-满足的计数。
for (int ps = 0; ps < 3; ps++) {
        ps2 = 0;
        for (int cs = 0; cs < len; cs++) {
            if (cc[cs].point.x != tt[ps].x || cc[cs].point.y != tt[ps].y) {
                cc[ps2] = cc[cs];
                ps2++;
            }else{
                cnts++;
            }
        }
    }

完整代码如下:

#include <iostream>
#include <memory>
#include <string.h>

using namespace std;
typedef struct {
    int x;
    int y;
} Point;

typedef struct {
    Point point;
    int Times;
} CCPoints;

int main() {
    int n;
    CCPoints aa[10];
    for (int i = 0; i < 10; i++) {
        aa[i].point = {i, i};
        aa[i].Times = i + 2;
    }
    for (int i = 0; i < 10; i++) {
        cout << "i = " << i << "   " << aa[i].point.x << "  " << aa[i].point.y
             << "  " << aa[i].Times << endl;
    }
    cout << endl;
    const CCPoints* bb = aa;

    Point tt[3];
    tt[0] = {2, 2};
    tt[1] = {4, 4};
    tt[2] = {7, 7};
    auto* cc = new CCPoints[10];
    
    for(int i = 0 ;i<10;i++){
        cc[i].point = {bb[i].point.x,bb[i].point.y};
        cc[i].Times = bb[i].Times;
    }

    int ps2 = 0, cnts = 0;
    int j = 0;
    int len = 10;
    for (int ps = 0; ps < 3; ps++) {
        ps2 = 0;
        for (int cs = 0; cs < len; cs++) {
            if (cc[cs].point.x != tt[ps].x || cc[cs].point.y != tt[ps].y) {
                cc[ps2] = cc[cs];
                ps2++;
            }else{
                cnts++;
            }
        }
    }
    cout << "  cnts  " << cnts << endl << endl << endl;
    
    for (int i = 0; i < len-3; i++) {
        cout << " i " << cc[i].point.x << "  " << cc[i].point.y << "  "
             << cc[i].Times << endl;
    }
    delete[] cc;
}

运行结果

i = 0   0  0  2
i = 1   1  1  3
i = 2   2  2  4
i = 3   3  3  5
i = 4   4  4  6
i = 5   5  5  7
i = 6   6  6  8
i = 7   7  7  9
i = 8   8  8  10
i = 9   9  9  11

  cnts  3


 i 0  0  2
 i 1  1  3
 i 3  3  5
 i 5  5  7
 i 6  6  8
 i 8  8  10
 i 9  9  11

解决思路2

主要逻辑如下:

  1. 第一for遍历A 数组所有元素
  2. 第二for遍历B数组所有元素,如果B中所有元素均与当前遍历的A元素一致则停止该for
  3. 2步骤中:如果B中所有元素均与当前遍历的A元素不一致,那么缓存该值。
  4. 最终的值就是该缓存的值
for (int ps = 0; ps < len; ps++) {
        flag = false;
        for (int cs = 0; cs < 3; cs++) {
            if (bb[ps].point.x == tt[cs].x && bb[ps].point.y == tt[cs].y) {
                flag = true;
                break;
            }
        }
        if (!flag) {
            cc[ps2] = bb[ps];
            ps2++;
        }
    }

完整代码如下:

#include <string.h>

#include <iostream>
#include <memory>

using namespace std;
typedef struct {
    int x;
    int y;
} Point;

typedef struct {
    Point point;
    int Times;
} CCPoints;

int main() {
    int n;
    CCPoints aa[10];
    for (int i = 0; i < 10; i++) {
        aa[i].point = {i, i};
        aa[i].Times = i + 2;
    }
    for (int i = 0; i < 10; i++) {
        cout << "i = " << i << "   " << aa[i].point.x << "  " << aa[i].point.y
             << "  " << aa[i].Times << endl;
    }
    cout << endl;
    const CCPoints* bb = aa;

    Point tt[3];
    tt[0] = {2, 2};
    tt[1] = {4, 4};
    tt[2] = {7, 7};
    auto* cc = new CCPoints[12];

    int ps2 = 0;
    int len = 10;
    bool flag = false;
    for (int ps = 0; ps < len; ps++) {
        flag = false;
        for (int cs = 0; cs < 3; cs++) {
            if (bb[ps].point.x == tt[cs].x && bb[ps].point.y == tt[cs].y) {
                flag = true;
                break;
            }
        }
        if (!flag) {
            cc[ps2] = bb[ps];
            ps2++;
        }
    }
    cout << "  " << ps2 << endl << endl << endl;
    for (int i = 0; i < ps2; i++) {
        cout << " i " << cc[i].point.x << "  " << cc[i].point.y << "  "
             << cc[i].Times << endl;
    }
    delete[] cc;
}

参考:删除数组中的指定元素——C++实现

<think>我们正在讨论如何从JavaScript数组删除特定元素。根据引用内容,有几种方法可以实现。我将整理这些方法并补充一些其他常用方法。主要方法包括:1.使用splice()方法(需要知道索引)2.使用filter()方法(创建一个新数组)3.使用delete操作符(不推荐,因为会留下空位)4.使用pop()或shift()(如果元素数组的末尾或开头)5.自定义remove方法(如引用中所示,通过扩展数组原型)我将逐一解释这些方法,并给出示例代码。注意:引用中提到了一个自定义的remove方法,它是通过给Array.prototype添加一个remove方法来实现的。但是,扩展原生对象的原型可能会引起问题(例如,如果其他库也添加了同名方法,或者遍历数组属性时出现意外)。因此,在实际项目中,通常建议使用函数形式而不是修改原型。另外,引用中提到的indexOf方法在数组中查找元素,但要注意indexOf使用的是严格相等比较(===),所以如果数组中有对象或者NaN,可能无法正确匹配。我将介绍以下五种方法:方法1:使用splice()(需要知道索引)方法2:使用filter()(返回新数组,不改变原数组)方法3:使用delete操作符(会留下空位,不改变数组长度,不推荐)方法4:使用pop()和shift()(针对首尾元素)方法5:使用自定义函数(可以封装成工具函数,避免修改原型)同时,我会指出每种方法的适用场景和注意事项。现在开始详细说明:</think>### JavaScript 删除数组中指定元素的 5 种方法 #### 1. **`splice()` 方法**(直接修改原数组)[^1][^2][^3] ```javascript const arr = [10, 20, 30, 40]; const index = arr.indexOf(30); // 获取元素索引 if (index > -1) { arr.splice(index, 1); // 删除该索引处的元素 } console.log(arr); // [10, 20, 40] ``` **特点**: - 直接修改原数组 - 需先获取元素索引 - 适合精确删除已知位置的元素 #### 2. **`filter()` 方法**(创建新数组) ```javascript const arr = [1, 2, 3, 4, 2]; const newArr = arr.filter(item => item !== 2); // 保留不等于2的元素 console.log(newArr); // [1, 3, 4] ``` **特点**: - 返回新数组,不修改原数组 - 可删除所有匹配项(如示例中的多个2) - 内存开销较大(需新建数组) #### 3. **`pop()`/`shift()` 方法**(首尾删除) ```javascript // 删除尾部元素 const arr1 = [1, 2, 3]; arr1.pop(); console.log(arr1); // [1, 2] // 删除头部元素 const arr2 = [1, 2, 3]; arr2.shift(); console.log(arr2); // [2, 3] ``` **特点**: - 仅适用于首尾元素删除 - 无法指定任意位置元素 #### 4. **自定义原型方法**(扩展数组功能)[^2][^3] ```javascript // 扩展数组原型方法 Array.prototype.remove = function(val) { const index = this.indexOf(val); if (index > -1) this.splice(index, 1); }; // 使用示例 const fruits = ['🍎','🍌','🍊']; fruits.remove('🍌'); console.log(fruits); // ['🍎','🍊'] ``` **注意**: - 修改原型可能引发命名冲突 - 建议改为独立工具函数:`const remove = (arr, val) => { ... }` #### 5. **`delete` 操作符**(不推荐) ```javascript const arr = [5, 10, 15]; delete arr[1]; // 删除索引1的元素 console.log(arr); // [5, empty, 15] console.log(arr.length); // 3 (长度不变) ``` **缺陷**: - 不改变数组长度,产生空位(`empty`) - 遍历时会出现未定义值 - 破坏数组连续性 --- ### 方法对比与选择建议 | 方法 | 修改原数组 | 删除所有匹配 | 空位处理 | 适用场景 | |---------------|------------|--------------|----------|------------------------| | `splice()` | ✅ | ❌ (单次) | 自动填充 | 精确删除单个元素 | | `filter()` | ❌ | ✅ | 无空位 | 删除多个匹配项 | | `pop/shift` | ✅ | ❌ | 自动填充 | 仅首尾元素删除 | | 自定义方法 | ✅ | ❌ (单次) | 自动填充 | 需重复删除操作 | | `delete` | ✅ | ❌ | 产生空位 | **不推荐常规使用** | > **最佳实践**: > 1. 精确删除单个元素 → `splice()` + `indexOf()` > 2. 删除所有匹配元素 → `filter()` > 3. 避免使用`delete`操作符 > 4. 谨慎扩展原型,优先封装工具函数 ```javascript // 安全删除工具函数 (支持多元素) function removeItems(arr, ...values) { return arr.filter(item => !values.includes(item)); } const nums = [1, 2, 3, 4, 5]; console.log(removeItems(nums, 2, 4)); // [1, 3, 5] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值