stl

#include "stdafx.h"
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
 vector<int> coll;
 vector<int>::iterator pos;
 coll.push_back(2);
 coll.push_back(5);
 coll.push_back(4);
 coll.push_back(1);
 coll.push_back(6);
 coll.push_back(3);

 pos = min_element(coll.begin(),coll.end());
 cout <<"min:"<<*pos<<endl;
 pos = max_element(coll.begin(),coll.end());
 cout<<"Max:"<<*pos<<endl;
 sort(coll.begin(),coll.end());

 pos = find(coll.begin(),coll.end(),3);
    reverse(pos,coll.end());
 for(pos=coll.begin();pos!=coll.end();++pos)
 {
  cout<<*pos<<' '<<endl;

 }

为了调用算法必须含有头文件<algorithm>;

算法。 min_element,max_element,sort,find,在整个容器中寻找第一个数值为3的元素。reverse(pos,coll.end()),从pos位置开始反转。

#include "stdafx.h"
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
#include <deque>
using namespace std;

int main(int argc, char* argv[])
{
 list<int> coll1;
 vector<int> coll2;
 for (int i=1;i<=9;i++)
 {
  coll1.push_back(i);
 }
 coll2.resize(coll1.size());

 copy(coll1.begin(),coll1.end(),coll2.begin());
 for (int j=0;j<9;j++)
 {
  cout<<coll2[j]<<endl;
 }

 deque<int> coll3(coll1.size());
 copy(coll1.begin(),coll1.end(),coll3.begin());
    for (int m=0;m<9;m++)
 {
  cout<<coll3[m]<<endl;
 }

 使用copy将第一个区间内的全部元素拷贝到目标区间。第一个区间的起点和终点都几经指定。第二区间只指出起点。然而由于该算法执行的是覆写动作。而非安插动作。所以目标区间必须拥有足够的元素来被覆写。所以幺么确认目标区间内有足够的元素空间。要么采用insert iterators,要想让目标区间够大。你要不一开始就给它一个正确大小,要不就显式地改变其大小。这两个办法都只适用于序列容器(dequues,lists,vectors),关联式容器根本不会有此问题。因为关联式容器不可能被当作复写算法的操作目标。

#include "stdafx.h"
#include <string>
#include <vector>
#include <list>
#include <algorithm>
#include <iostream>
#include <deque>
#include <set>
using namespace std;
int main(int argc, char* argv[])
{
 list<int> coll1;
 for (int i=1;i<=9;i++)
 {
  coll1.push_back(i);
 }
 vector<int>coll2;
 copy(coll1.begin(),coll1.end(),back_inserter(coll2));
 for (i=0;i<9;i++)
 {
  cout<<coll2[i]<<endl;
 }
 deque<int> coll3;
 copy(coll1.begin(),coll1.end(),front_inserter(coll3));
    for (i=0;i<9;i++)
 {
  cout<<coll3[i]<<endl;
 }
 set<int> coll4;
 set<int>::iterator pos;
 copy(coll1.begin(),coll1.end(),inserter(coll4,coll4.begin()));
 for (pos=coll4.begin();pos!=coll4.end();pos++)
 {
  cout<<*pos<<endl;
 }

back_inserter安插于容器最尾端。front_inserter安插于容器最前端。

inserters一般性安插器。将元素插入初始化时接受之第二参数。所指位置的前方。

int main(int argc, char* argv[])
{

 list<int> col1;
 for (int i=1;i<=6;++i)
 {
  col1.push_front(i);
  col1.push_back(i);
 }
 copy(col1.begin(),col1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 list<int>::iterator end = remove(col1.begin(),col1.end(),3);
 copy(col1.begin(),end,ostream_iterator<int>(cout," "));
 cout<<endl;

cout<<"num of removed elements:"<<distance(end,coll.end())<<endl;
 col1.erase(end,col1.end());
 copy(col1.begin(),col1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

在这个版本中。remove的返回值被设定给end迭代器。这个end正是被修改之群集经过元素移除操作后逻辑上的新终点。另一种可能用法是。通过测定群集之逻辑终点和实际终点间的距离。获得被删除元素的数量。cout<<"num of removed elements:"<<distance(end,col1.end())<<endl;在这里distance的作用是返回两个迭代器之间的距离。erase用来真正的删除参数所指的区间内的全部元素。

int main(int argc, char* argv[])
{
 set<int> col1;
 for (int i=1;i<=9;++i)
 {
     col1.insert(i);
 }
 copy(col1.begin(),col1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;
 int num = col1.erase(3);
 cout<<"num of removed element:"<<num<<endl;
 copy(col1.begin(),col1.end(),ostream_iterator<int>(cout," "));
 cout<<endl;

容器类别提供了多个不同的erase成员函数。其中一种形式是以待删除之元素值为唯一参数。它会返回被删除的元素个数。当然在禁止元素重复的容器中(sets,maps),其返回值永远只能是0或1.

void print(int elem)
{
 cout<<elem<<' ';
}
int main(int argc, char* argv[])
{
 vector<int> col1;
 for (int i=1;i<=9;i++)
 {
  col1.push_back(i);
 }
 for_each(col1.begin(),col1.end(),print);
 cout<<endl;

这里的for_each函数针对col1.begin,col1.end区间内的每个元素调用print函数。

bool isPrime(int number)
{
 number = abs(number);
 if (number==0||number==1)
 {
  return true;
 }
 int divisor;
 for (divisor=number/2;number%divisor!=0;--divisor)
 {
  ;
 }
 return divisor ==1;
}
int main(int argc, char* argv[])
{
    list<int> col1;
 for(int i=24;i<=30;++i)
 {
  col1.push_back(i);
 }
 list<int>::iterator pos;
 pos = find_if(col1.begin(),col1.end(),isPrime);
 if (pos!=col1.end())
 {
  cout<<*pos<<" is first prime number found"<<endl;
 }
 else
 {
  cout<<"no found"<<endl;
 }

在这个例子中。find_if算法在给定区间内寻找使被传入之一元判断结果为true的第一个元素。

int main(int argc, char* argv[])
{
    deque<string>col1;
 col1.assign(3,string("string"));
 col1.push_back("last string");
 col1.push_front("first sting");
 copy(col1.begin(),col1.end(),ostream_iterator<string>(cout,"\n"));
 cout<<endl;
 col1.pop_front();
 col1.pop_back();
 for (int i=1;i<col1.size();++i)
 {
  col1[i]="another "+col1[i];
 }
 col1.resize(4,"resized sting");
 copy(col1.begin(),col1.end(),ostream_iterator<string>(cout,"\n"));

输出:

first string

string

string

string

last string

 

string

another string

another string

resized string

 

int main(int argc, char* argv[])
{
   list<char> coll;
   for(char c='a';c<='z';++c)
   {
    coll.push_back(c);
   }
   while (!coll.empty())
   {
    cout<<coll.front()<<' ';
    coll.pop_front();

   }
   cout<<endl;

front输出第一个。pop_front弹出第一个元素但不会返回被删除的元素。所以两个不能合二为一, lists并没有提供以operator[]直接存取元素的能力

 关联式容器:

sets:set的内部元素依据其值自动排序,每个值只能出现一次。不允许重复

Multisets:和set相同。只不过它允许重复元素。

Maps:Maps的元素都是"key/value",每个元素有一个键,每一个键只能出现一次。不允许重复。

Multimaps:允许重复元素。multimap可被当做字典。

container::iterator

这种迭代器以读写模式遍历元素

container::const_iterator

 这种迭代器以只读模式遍历元素。

int main(int argc, char* argv[])
{
 typedef std::map< int, int > Map;
 Map map; 
 map[ 0 ] = 1;
 map[ 2 ] = 3; 
 Map::iterator p = map.begin( );
 std::cout << "map[ " << p->first
  << " ] = " << p->second << ";\n";

iterator->first取键。iterator->second取值

 map<char, int> m;
 for(int i=0; i<26; i++) {
  m.insert(make_pair((char)('A'+i), 65+i));
 }
 char ch = 'G'; 
 map<char, int>::iterator p;
 p = m.find(ch);
 if(p != m.end())
  cout << "Its ASCII value is  " << p->second;
 else
    cout << "Key not in map.\n";

用make_pair将键值插入map

int main(int argc, char* argv[])
{
   list<int> coll;
   for (int i=1;i<=9;++i)
   {
    coll.push_back(i);
   }
   list<int>::iterator pos = coll.begin();
   cout<<*pos<<endl;
   advance(pos,3);
   cout<<*pos<<endl;
   advance(pos,-1);
   cout<<*pos<<endl;
}

advance将跌加器加

list<int> coll;
   for (int i=-3;i<=9;++i)
   {
    coll.push_back(i);
   }
   list<int>::iterator pos;
   pos = find(coll.begin(),coll.end(),5);
   if (pos !=coll.end())
   {
    cout <<"difference between beginning and 5:"<<distance(coll.begin(),pos)<<endl;
   }
   else
   {
       cout<<"5 not found"<<endl;
   }

distance处理两个迭代器之间的距离

iter_swap交换两个迭代器的位置。比如iter_swap(coll.begin(),++coll.begin());

reverse_iterator逆向迭代器。

算法头文件。要用c++标准程序库的算法。首先含入头文件<algorithm>,某些算法用于数值处理。因此被定义于头文件<numeric>,你经常需要用到仿函数,他们都被定义于<functional>

1:尾词 _if

如果算法有两种形式,参数个数都相同。但第一个形式的参数要求传递一个值,第二形式的参数要求传递一个函数或仿函数。那么尾词_if就派上了用场。无尾词的那个要求传递数值。有的那个要求传递函数或仿函数。比如。find()用来搜寻具有某值的元素。而find_if接受一个被当作搜寻准则的函数或仿函数。并搜寻第一个满足该准则的元素。

2:尾词_copy

用来表示在此算法中。元素不光被操作。还会被复制到目标区间。比如。reverse将区间中的元素颠倒次序。而Reverse_copy则是逆序将元素复制到另一个区间。

search_n()搜寻具有某特性的第一段n个连续元素。search搜寻某个子区间第一词出现位置。find_end搜寻某个子区间最后一次出现位置,find_first_of搜寻等于"某数个子值之一"的第一个元素。equal判断两区间是否相等。mismatch返回两序列的各组对应元素中。第一对不相等元素。lexicographical_compare判断某一序列在字典顺序下是否小于另一个序列。for_each,copy,transform变动并复制元素。将两个区间的元素合并。swap_ranges,fill以给定值替换每一个元素。replace,replace_if,replace_copy,replace_copy_if,remove,remove_if,remove_copy将不等于某特定值的元素全部复制到它处。remove_copy_if,unique,unique_copy,reverse,reverse_copy,rotate,rotate_copy,

sort,stable_sort将所有元素排序,并保持相等元素间的相对次序。portial_sort排序。直到前n个元素就位。partition改变元素次序。使得符合某准则的元素放在前面。

binary_search判断某区间是否包含某元素。include,lower_bound,upper_bound,equal_range,set_union,

 

 

 

 

 

 

原文链接: https://www.cnblogs.com/lzjsky/archive/2010/07/05/1771642.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    stl

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/12506

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 上午11:31
下一篇 2023年2月7日 上午11:32

相关推荐