STL

std::partition  
 
Syntax:
 
#include <algorithm>
bidirectional_iterator partition( bidirectional_iterator start, bidirectional_iterator end, Predicate p );
算法partition按照谓词p的返回值是true或是false重新整理[start, end)之间的所有元素.
换句话说, partition利用p将元素分成两组. 其返回值是一个指向false组第一个元素的迭代器
partition以线性时间(linear time)运行
 
直接看以下代码:
bool IsOdd (int i) { return (i%2)==1; }
int main () {
vector<int> myvector;
vector<int>::iterator it, bound;
// set some values:
for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9
bound = partition (myvector.begin(), myvector.end(), IsOdd);
// print out content:
cout << "odd members:";
for (it=myvector.begin(); it!=bound; ++it)
cout << " " << *it;
cout << "\neven members:";
for (it=bound; it!=myvector.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
显然返回的是1,2两组的分界点,同是也是第2组的第1个元素。所有元素是按true,false排列。
 
2
nth_element
 
bool myfunction (int i,int j) { return (i>j); }
int main () {
  vector<int> myvector;
  vector<int>::iterator it;
  // set some values:
  for (int i=1; i<10; i++) myvector.push_back(i);   // 1 2 3 4 5 6 7 8 9
  random_shuffle (myvector.begin(), myvector.end());
  // using default comparison (operator <):
  nth_element (myvector.begin(), myvector.begin()+5, myvector.end());
  // using function as comp
  nth_element (myvector.begin(), myvector.begin()+5, myvector.end(),myfunction);
  // print out content:
  cout << "myvector contains:";
  for (it=myvector.begin(); it!=myvector.end(); ++it)
    cout << " " << *it;
  cout << endl;
  return 0;
}
 
通过调用nth_element(start, start+n, end) 方法可以使第n大元素处于第n位置(从0开始,其位置是下标为 n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大(或相等)的元素都排在这个元素之后(规则p存在的情况下按规则p),但不能保证他们是有序的。
经测试,确实以上代码是有序的,但测试orb代码时发现是无序的。
以下是网上找到的容易理解的:
nth_element的直接意图是返回第n大元素的位置,它还有一个副作用,就是能保证nth前面的元素都
小于nth,所以,很容易进一步处理得到前n大元素排名。
 
3
初始化vector
如vector<Point> ang_proj_v(10);即可建立容量为10的一个vector
posted @ 2013-01-11 23:13  yurius  阅读(119)  评论(0编辑  收藏  举报