響應(yīng)式網(wǎng)站制作軟件網(wǎng)上怎么推廣產(chǎn)品
聲明:本文內(nèi)容生成自ChatGPT,目的是為方便大家了解學(xué)習(xí)作為引用到作者的其他文章中。
std::unique
是 C++ 標(biāo)準(zhǔn)庫中的一個算法函數(shù),用于移除相鄰的重復(fù)元素,使每個相鄰的元素在容器中保持唯一。它不會真正移除元素,而是通過重新排列元素來消除相鄰的重復(fù)項,并返回一個指向新結(jié)尾的迭代器。此算法通常和 std::erase
或者 std::erase-remove idiom
結(jié)合使用,以實際移除不需要的元素。
語法
#include <algorithm>template <class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last);template <class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPredicate p);
參數(shù)
first
,last
:表示要處理的范圍的迭代器。p
(可選):自定義的二元謂詞,用于定義 "相等" 的標(biāo)準(zhǔn)。
返回值
std::unique
返回一個迭代器,指向刪除相鄰重復(fù)元素后的新結(jié)尾位置。容器中從該位置到 last
之間的元素仍然存在,但它們的值是未定義的。
特點
std::unique
只移除相鄰的重復(fù)元素。如果需要移除所有重復(fù)的元素,通常需要先使用std::sort
對容器排序。- 它通過重新排列容器中的元素,將相鄰重復(fù)的元素放置在一起并返回新范圍的末尾迭代器。容器的大小不會實際改變。
示例
1. 基本使用(移除相鄰重復(fù)項)
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 1, 2, 3, 3, 4, 5, 5, 6};// 使用 std::unique 移除相鄰的重復(fù)項auto new_end = std::unique(vec.begin(), vec.end());// 打印結(jié)果std::cout << "Vector after unique: ";for (auto it = vec.begin(); it != new_end; ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}
輸出:
Vector after unique: 1 2 3 4 5 6
2. 實際移除重復(fù)項(結(jié)合 erase
)
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 1, 2, 3, 3, 4, 5, 5, 6};// 使用 std::unique 移除相鄰的重復(fù)項auto new_end = std::unique(vec.begin(), vec.end());// 使用 erase 減少容器大小vec.erase(new_end, vec.end());// 打印結(jié)果std::cout << "Vector after erase: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
輸出:
Vector after erase: 1 2 3 4 5 6
3. 自定義謂詞
你可以通過提供自定義的謂詞來定義 "相等" 的標(biāo)準(zhǔn)。例如,比較絕對值相等的元素:
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>int main() {std::vector<int> vec = {1, -1, 2, 3, -3, 4, 5, 5, 6};// 使用自定義謂詞來移除相鄰絕對值相等的元素auto new_end = std::unique(vec.begin(), vec.end(), [](int a, int b) {return std::abs(a) == std::abs(b);});// 使用 erase 減少容器大小vec.erase(new_end, vec.end());// 打印結(jié)果std::cout << "Vector after unique with custom predicate: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
輸出:
Vector after unique with custom predicate: 1 2 3 4 5 6
4. 非相鄰重復(fù)元素的移除(排序+unique)
std::unique
只移除相鄰的重復(fù)元素。如果容器中存在非相鄰的重復(fù)元素,通常需要先排序。
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 5, 2, 3, 3, 4, 5, 1, 6};// 對容器進行排序std::sort(vec.begin(), vec.end());// 使用 std::unique 移除所有重復(fù)的元素auto new_end = std::unique(vec.begin(), vec.end());// 使用 erase 減少容器大小vec.erase(new_end, vec.end());// 打印結(jié)果std::cout << "Vector after sort and unique: ";for (const auto& num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
輸出:
Vector after sort and unique: 1 2 3 4 5 6
總結(jié)
std::unique
是一個用于移除相鄰重復(fù)元素的算法。- 它通過重新排列容器中的元素,將不需要的重復(fù)元素移動到末尾,并返回新的末尾位置。
- 如果想要實際移除元素,需要結(jié)合
erase
函數(shù)。 - 如果容器中存在非相鄰的重復(fù)元素,通常需要先使用
std::sort
對容器進行排序。