亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧

P粉602998670
發(fā)布: 2025-08-18 11:49:01
原創(chuàng)
854人瀏覽過

c++++中利用指針進(jìn)行數(shù)組去重的核心在于通過雙指針實(shí)現(xiàn)原地修改和高效遍歷。1. 使用 slow 和 fast 兩個(gè)指針,slow 指向去重后的末尾,fast 遍歷數(shù)組;2. 當(dāng) fast 指向的元素與 slow 不同時(shí),將其復(fù)制到 slow+1 的位置并移動(dòng) slow;3. 對(duì)于未排序數(shù)組,可先排序再用雙指針,或使用哈希表記錄已出現(xiàn)元素以實(shí)現(xiàn) o(n) 時(shí)間復(fù)雜度;4. 可借助 std::unique 和 std::erase 實(shí)現(xiàn)簡(jiǎn)潔但效率較低的去重方法;5. 對(duì)象或結(jié)構(gòu)體數(shù)組需重載 == 運(yùn)算符或提供自定義比較函數(shù);6. 原地操作雖節(jié)省內(nèi)存但會(huì)修改原始數(shù)組,必要時(shí)應(yīng)創(chuàng)建副本或采用替代方案如哈希表、外部排序。

C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧

C++中利用指針進(jìn)行數(shù)組去重的核心在于,通過指針操作實(shí)現(xiàn)高效的遍歷和原地修改,避免額外的內(nèi)存開銷。雙指針?biāo)惴ㄊ顷P(guān)鍵,一個(gè)指針用于遍歷數(shù)組,另一個(gè)指針指向去重后的數(shù)組的末尾。

C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧

解決方案

核心思路是使用兩個(gè)指針:

slow
登錄后復(fù)制
fast
登錄后復(fù)制
。
fast
登錄后復(fù)制
指針遍歷整個(gè)數(shù)組,
slow
登錄后復(fù)制
指針指向去重后數(shù)組的末尾。如果
fast
登錄后復(fù)制
指針指向的元素與
slow
登錄后復(fù)制
指針指向的元素不同,則將
fast
登錄后復(fù)制
指針指向的元素復(fù)制到
slow + 1
登錄后復(fù)制
的位置,并將
slow
登錄后復(fù)制
指針向后移動(dòng)一位。

立即學(xué)習(xí)C++免費(fèi)學(xué)習(xí)筆記(深入)”;

C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧

以下是一個(gè)示例代碼:

#include <iostream>
#include <algorithm>

int* removeDuplicates(int* arr, int size) {
    if (size == 0) {
        return arr; // 空數(shù)組,無需去重
    }

    int* slow = arr;
    int* fast = arr + 1;

    while (fast < arr + size) {
        if (*fast != *slow) {
            *(++slow) = *fast; // 先移動(dòng) slow 指針,再賦值
        }
        ++fast;
    }

    return arr; // 返回原始數(shù)組的指針,但數(shù)組已被修改
}


int main() {
    int arr[] = {1, 1, 2, 2, 3, 4, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);

    removeDuplicates(arr, size);

    // 輸出去重后的數(shù)組(實(shí)際長(zhǎng)度需要單獨(dú)計(jì)算)
    for (int i = 0; i < size; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // 計(jì)算去重后的數(shù)組的實(shí)際長(zhǎng)度
    int* last = arr;
    while(*(last+1) != 5 && last < arr + size - 1){
        last++;
    }

    std::cout << "去重后的數(shù)組長(zhǎng)度: " << last - arr + 1 << std::endl;

    return 0;
}
登錄后復(fù)制

這段代碼直接修改了原始數(shù)組。注意,雖然數(shù)組的內(nèi)容被修改了,但數(shù)組的大小并沒有改變。你需要單獨(dú)記錄去重后數(shù)組的實(shí)際長(zhǎng)度,例如通過計(jì)算

slow
登錄后復(fù)制
指針指向的最后一個(gè)有效元素的索引。

C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧

如何處理未排序的數(shù)組去重?

如果數(shù)組未排序,一種方法是先對(duì)其進(jìn)行排序,然后再使用雙指針?biāo)惴āE判蚩梢允褂?

std::sort
登錄后復(fù)制
函數(shù)。但是,排序的時(shí)間復(fù)雜度為 O(n log n),所以對(duì)于未排序數(shù)組,如果對(duì)性能要求較高,可以考慮使用哈希表(
std::unordered_set
登錄后復(fù)制
)來記錄已經(jīng)出現(xiàn)的元素,這樣可以在 O(n) 的時(shí)間復(fù)雜度內(nèi)完成去重,但會(huì)占用額外的內(nèi)存空間。 例如:

人聲去除
人聲去除

用強(qiáng)大的AI算法將聲音從音樂中分離出來

人聲去除23
查看詳情 人聲去除
#include <iostream>
#include <algorithm>
#include <unordered_set>

int removeDuplicatesUnsorted(int* arr, int size) {
    if (size == 0) {
        return 0;
    }

    std::unordered_set<int> seen;
    int j = 0;
    for (int i = 0; i < size; ++i) {
        if (seen.find(arr[i]) == seen.end()) {
            seen.insert(arr[i]);
            arr[j++] = arr[i];
        }
    }
    return j; // 返回去重后的數(shù)組長(zhǎng)度
}

int main() {
    int arr[] = {5, 2, 1, 2, 3, 4, 1, 5};
    int size = sizeof(arr) / sizeof(arr[0]);

    int newSize = removeDuplicatesUnsorted(arr, size);

    // 輸出去重后的數(shù)組
    for (int i = 0; i < newSize; ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "去重后的數(shù)組長(zhǎng)度: " << newSize << std::endl;

    return 0;
}
登錄后復(fù)制

使用
std::unique
登錄后復(fù)制
std::erase
登錄后復(fù)制
進(jìn)行去重的優(yōu)缺點(diǎn)?

C++ 標(biāo)準(zhǔn)庫(kù)提供了

std::unique
登錄后復(fù)制
函數(shù),它可以將數(shù)組中相鄰的重復(fù)元素移動(dòng)到數(shù)組的末尾,并返回指向去重后數(shù)組末尾的迭代器。然后,可以使用
std::erase
登錄后復(fù)制
函數(shù)刪除這些重復(fù)元素。這種方法的優(yōu)點(diǎn)是簡(jiǎn)潔易懂,缺點(diǎn)是效率相對(duì)較低,因?yàn)樗枰苿?dòng)元素和刪除元素。

#include <iostream>
#include <algorithm>
#include <vector>

int main() {
    std::vector<int> arr = {1, 1, 2, 2, 3, 4, 4, 5};

    // 使用 std::unique 將重復(fù)元素移動(dòng)到末尾
    auto it = std::unique(arr.begin(), arr.end());

    // 使用 std::erase 刪除重復(fù)元素
    arr.erase(it, arr.end());

    // 輸出去重后的數(shù)組
    for (int i = 0; i < arr.size(); ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "去重后的數(shù)組長(zhǎng)度: " << arr.size() << std::endl;

    return 0;
}
登錄后復(fù)制

std::unique
登錄后復(fù)制
只能作用于連續(xù)內(nèi)存空間,例如
std::vector
登錄后復(fù)制
。 對(duì)于原始數(shù)組,需要先將其復(fù)制到
std::vector
登錄后復(fù)制
中。

如何處理包含對(duì)象或結(jié)構(gòu)體的數(shù)組去重?

如果數(shù)組包含的是對(duì)象或結(jié)構(gòu)體,你需要定義一個(gè)比較函數(shù),用于判斷兩個(gè)對(duì)象是否相等。然后,可以將這個(gè)比較函數(shù)傳遞給

std::unique
登錄后復(fù)制
函數(shù)?;蛘?,重載
==
登錄后復(fù)制
運(yùn)算符。

例如:

#include <iostream>
#include <algorithm>
#include <vector>

struct Point {
    int x;
    int y;

    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

int main() {
    std::vector<Point> arr = {{1, 2}, {1, 2}, {3, 4}, {5, 6}, {5, 6}};

    auto it = std::unique(arr.begin(), arr.end());
    arr.erase(it, arr.end());

    for (const auto& p : arr) {
        std::cout << "(" << p.x << ", " << p.y << ") ";
    }
    std::cout << std::endl;

    std::cout << "去重后的數(shù)組長(zhǎng)度: " << arr.size() << std::endl;

    return 0;
}
登錄后復(fù)制

如果對(duì)象或結(jié)構(gòu)體沒有重載

==
登錄后復(fù)制
運(yùn)算符,則需要提供一個(gè)自定義的比較函數(shù),并將其傳遞給
std::unique
登錄后復(fù)制

#include <iostream>
#include <algorithm>
#include <vector>

struct Point {
    int x;
    int y;
};

bool comparePoints(const Point& a, const Point& b) {
    return a.x == b.x && a.y == b.y;
}

int main() {
    std::vector<Point> arr = {{1, 2}, {1, 2}, {3, 4}, {5, 6}, {5, 6}};

    auto it = std::unique(arr.begin(), arr.end(), comparePoints);
    arr.erase(it, arr.end());

    for (const auto& p : arr) {
        std::cout << "(" << p.x << ", " << p.y << ") ";
    }
    std::cout << std::endl;

    std::cout << "去重后的數(shù)組長(zhǎng)度: " << arr.size() << std::endl;

    return 0;
}
登錄后復(fù)制

原地操作的局限性與替代方案

原地操作雖然節(jié)省了內(nèi)存,但它直接修改了原始數(shù)組,這在某些情況下可能不合適。如果需要保留原始數(shù)組,可以先創(chuàng)建一個(gè)副本,然后在副本上進(jìn)行去重操作。此外,如果數(shù)組非常大,原地操作可能會(huì)導(dǎo)致性能問題,因?yàn)樾枰l繁地移動(dòng)元素。在這種情況下,可以考慮使用其他算法,例如哈希表,或者使用外部排序。

以上就是C++中如何用指針實(shí)現(xiàn)數(shù)組去重 雙指針?biāo)惴ㄅc原地操作技巧的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
熱門教程
更多>
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)