查找算法
adjacent_find()
在iterator對標識元素范圍內,查找一對相鄰重復元素,找到則返回指向這對元素的第一個元素的迭代器。否則返回past-the-end。
vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(2);
vecInt.push_back(3);
vecInt.push_back(4);
vecInt.push_back(5);
vecInt.push_back(5);
vector<int>::iterator it = adjacent_find(vecInt.begin(), vecInt.end());
binary_search
在有序序列中查找value,找到則返回true。注意:在無序序列中,不可使用。
set<int> setInt;
setInt.insert(2);
setInt.insert(1);
setInt.insert(8);
setInt.insert(5);
setInt.insert(9);
bool bFind = binary_search(setInt.begin(),setInt.end(),8);
count()
利用等于操作符,把標志范圍內的元素與輸入值比較,返回相等的個數。
vector<int> vecInt;
vecInt.push_back(8);
vecInt.push_back(2);
vecInt.push_back(1);
vecInt.push_back(4);
vecInt.push_back(8);
vecInt.push_back(6);
int iCount = count(vecInt.begin(),vecInt.end(),8); //iCount==2
count_if()
count_if 算法計算中的元素范圍 [first, last),返回滿足條件的元素的數量。
vector<int> vecInt;
vecInt.push_back(3);
vecInt.push_back(3);
vecInt.push_back(1);
vecInt.push_back(4);
vecInt.push_back(8);
vecInt.push_back(9);
int count = count_if(vecInt.begin(), vecInt.end(), evenNumber);// 偶數個數是 2;
find
利用底層元素的等于操作符,對指定范圍內的元素與輸入值進行比較。當匹配時,結束搜索,返回該元素的迭代器。
vector<int> vecInt;
vecInt.push_back(3);
vecInt.push_back(3);
vecInt.push_back(2);
vecInt.push_back(4);
vecInt.push_back(8);
vecInt.push_back(9);
vector<int>::iterator it = find(vecInt.begin(), vecInt.end(), 2);
equal_range:
返回一對iterator,第一個表示lower_bound,第二個表示upper_bound。
set<int> setInt;
for (int i=0; i<10; i++)
{
setInt.insert(i+1);
}
pair<set<int>::iterator, set<int>::iterator> mypair = setInt.equal_range(3);
set<int>::iterator it1 = mypair.first;
cout << "it1:" << *it1 << endl; //3 //4
set<int>::iterator it2 = mypair.second;
cout << "it2:" << *it2 << endl; //4 //4
查找算法
merge()
以下是排序和通用算法:提供元素排序策略
merge: 合并兩個有序序列,存放到另一個序列。
例如:vecIntA,vecIntB,vecIntC是用vector<int>聲明的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素
vecIntC.resize(9); //擴大容量
merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());
此時vecIntC就存放了按順序的1,2,3,4,5,6,7,8,9九個元素
sort()
sort: 以默認升序的方式重新排列指定范圍內的元素。若要改排序規則,可以輸入比較函數。
//學號比較函數
bool Compare(const Student &stuA,const Student &stuB)
{
return (stuA.getID()<stuB.getID());
}
int main()
{
vector<Student> vecStu;
vecStu.push_back(Student(2,"趙彤"));
vecStu.push_back(Student(1,"王偉"));
vecStu.push_back(Student(4,"李明"));
vecStu.push_back(Student(3,"張燕"));
sort(vecStu.begin(),vecStu.end(),Compare);
for (vector<Student>::iterator it = vecStu.begin();it!= vecStu.end();it++) {
cout<<it->getName() <<endl;
}
}
random_shuffle()
random_shuffle: 對指定范圍內的元素隨機調整次序。
srand(time(0)); //設置隨機種子
vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
string str("itcastitcast ");
random_shuffle(vecInt.begin(), vecInt.end()); //隨機排序,結果比如:9,7,1,5,3
random_shuffle(str.begin(), str.end()); //隨機排序,結果比如:" itstcasticat "
reverse()
vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
reverse(vecInt.begin(), vecInt.end()); //{9,7,5,3,1}