常用STL容器及算法举例

一 常用容器举例

1 vector:

vector类似于动态数组,直接访问元素,从后面快速插入或者删除,示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <vector>//包含vector
  3. using namespace std;//指定命名空间
  4. int main()
  5. {
  6. cout<<"----------vector test-----------"<<endl;
  7. //定义一个vector
  8. vector <int> vect;
  9. vector <int> vect1(12);//12个int类型元素,每个元素的初始值均为0
  10. vector <int> vect2(12,9);//12个int,初试值均为9
  11. //使用数组初始化vector
  12. int a[]={0,1,2,3,4,5,6,7,8,9,0};
  13. //vector <数据类型> <容器名> (<开始地址>,<结束地址的下一个地址> )。执行过vt中元素为1,2,3
  14. vector <int> vt(a+1,a+4);
  15. //在尾部压入3个值
  16. vt.push_back(1);
  17. vt.push_back(2);
  18. vt.push_back(3);
  19. //定义迭代器iterator
  20. vector <int>::iterator iter=vt.begin();//起始地址
  21. vector <int>::iterator iter_end=vt.end();//结束地址,两个地址都是指针类型
  22. //遍历vt
  23. for(;iter!=iter_end;iter++)
  24. {
  25. cout<<*iter<<endl;
  26. }
  27. //弹出一个元素
  28. vt.pop_back();
  29. //以下两行重新获得起始和结尾地址
  30. iter=vt.begin();
  31. iter_end=vt.end();
  32. cout<<"----------executed pop_back------"<<endl;
  33. for(;iter!=iter_end;iter++)
  34. {
  35. cout<<*iter<<endl;
  36. }
  37. //插入元素
  38. cout<<"----------insert into------------"<<endl;
  39. //插入格式:vector.insert(<起始地址>,<插入的数量>,<元素值>);如果插入的数量为1,则第二个参数可以被省略
  40. vt.insert(vt.begin()+1,3,9);
  41. iter=vt.begin();
  42. iter_end=vt.end();
  43. for(;iter!=iter_end;iter++)
  44. {
  45. cout<<*iter<<endl;
  46. }
  47. //删除元素
  48. cout<<"----------erase-------------------"<<endl;
  49. //删除格式1为:vector.erase(<删除元素的地址>);
  50. //删除格式2为:vector.erase(<删除元素的起始地址>,<终止地址>);
  51. iter=vt.begin();
  52. iter_end=vt.end();
  53. vt.erase(iter+1,iter_end);//删除第二个到最后一个的元素
  54. iter_end=vt.end();
  55. for(;iter!=iter_end;iter++)
  56. {
  57. cout<<*iter<<endl;
  58. }
  59. return 1;
  60. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <vector>//包含vector
  3. using namespace std;//指定命名空间
  4. int main()
  5. {
  6. cout<<"----------vector test-----------"<<endl;
  7. //定义一个vector
  8. vector <int> vect;
  9. vector <int> vect1(12);//12个int类型元素,每个元素的初始值均为0
  10. vector <int> vect2(12,9);//12个int,初试值均为9
  11. //使用数组初始化vector
  12. int a[]={0,1,2,3,4,5,6,7,8,9,0};
  13. //vector <数据类型> <容器名> (<开始地址>,<结束地址的下一个地址> )。执行过vt中元素为1,2,3
  14. vector <int> vt(a+1,a+4);
  15. //在尾部压入3个值
  16. vt.push_back(1);
  17. vt.push_back(2);
  18. vt.push_back(3);
  19. //定义迭代器iterator
  20. vector <int>::iterator iter=vt.begin();//起始地址
  21. vector <int>::iterator iter_end=vt.end();//结束地址,两个地址都是指针类型
  22. //遍历vt
  23. for(;iter!=iter_end;iter++)
  24. {
  25. cout<<*iter<<endl;
  26. }
  27. //弹出一个元素
  28. vt.pop_back();
  29. //以下两行重新获得起始和结尾地址
  30. iter=vt.begin();
  31. iter_end=vt.end();
  32. cout<<"----------executed pop_back------"<<endl;
  33. for(;iter!=iter_end;iter++)
  34. {
  35. cout<<*iter<<endl;
  36. }
  37. //插入元素
  38. cout<<"----------insert into------------"<<endl;
  39. //插入格式:vector.insert(<起始地址>,<插入的数量>,<元素值>);如果插入的数量为1,则第二个参数可以被省略
  40. vt.insert(vt.begin()+1,3,9);
  41. iter=vt.begin();
  42. iter_end=vt.end();
  43. for(;iter!=iter_end;iter++)
  44. {
  45. cout<<*iter<<endl;
  46. }
  47. //删除元素
  48. cout<<"----------erase-------------------"<<endl;
  49. //删除格式1为:vector.erase(<删除元素的地址>);
  50. //删除格式2为:vector.erase(<删除元素的起始地址>,<终止地址>);
  51. iter=vt.begin();
  52. iter_end=vt.end();
  53. vt.erase(iter+1,iter_end);//删除第二个到最后一个的元素
  54. iter_end=vt.end();
  55. for(;iter!=iter_end;iter++)
  56. {
  57. cout<<*iter<<endl;
  58. }
  59. return 1;
  60. }

2  list

list 为双向链表,可以从任何地方插入或者删除的,其示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. void main()
  5. {
  6. list<int> c1;
  7. c1.push_back(1);//从尾部push数据(结点)到list中
  8. c1.push_back(2);
  9. c1.push_back(3);
  10. c1.push_back(4);
  11. c1.push_front(0);//从头部push数据(结点)到list中
  12. c1.pop_back();//从尾部pop数据(结点)出去
  13. int& i = c1.back();//获取list中尾部数据(结点)
  14. const int& ii = c1.front();//获取list中头部 数据(结点)
  15. cout << "The last integer of c1 is " << i << endl;
  16. cout << "The front interger of c1 is " << ii << endl;
  17. cout << "for循环读出数据举例:" << endl;
  18. //循环遍历数据举例
  19. list<int>::iterator it; //定义遍历指示器(类似于int i=0)
  20. for(it = c1.begin() ; it != c1.end() ;it++)
  21. {
  22. cout << *it << endl;
  23. }
  24. system("pause");
  25. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <list>
  3. using namespace std;
  4. void main()
  5. {
  6. list<int> c1;
  7. c1.push_back(1);//从尾部push数据(结点)到list中
  8. c1.push_back(2);
  9. c1.push_back(3);
  10. c1.push_back(4);
  11. c1.push_front(0);//从头部push数据(结点)到list中
  12. c1.pop_back();//从尾部pop数据(结点)出去
  13. int& i = c1.back();//获取list中尾部数据(结点)
  14. const int& ii = c1.front();//获取list中头部 数据(结点)
  15. cout << "The last integer of c1 is " << i << endl;
  16. cout << "The front interger of c1 is " << ii << endl;
  17. cout << "for循环读出数据举例:" << endl;
  18. //循环遍历数据举例
  19. list<int>::iterator it; //定义遍历指示器(类似于int i=0)
  20. for(it = c1.begin() ; it != c1.end() ;it++)
  21. {
  22. cout << *it << endl;
  23. }
  24. system("pause");
  25. }

3 deque:

deque: 是一个double-ended queue,

1)支持随即存取,也就是[]操作符,

2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:

1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list

3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

示例代码如下:

[cpp] view
plain
copyprint?

  1. /*deque: 是一个double-ended queue,
  2. 1)支持随即存取,也就是[]操作符,
  3. 2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多
  4. 因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
  5. 1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  6. 2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  7. 3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
  8. */
  9. #include <iostream>
  10. #include <deque>
  11. using namespace std;
  12. void printDeque(const deque<int>& d)
  13. {
  14. cout<<"\n使用下标:\n";
  15. for (unsigned int i = 0; i < d.size(); i++)
  16. {
  17. cout<<"d["<<i<<"] = "<<d[i]<<", ";
  18. }
  19. cout<<"\n使用迭代器\n";
  20. deque<int>::const_iterator iter = d.begin();
  21. for (;iter != d.end(); iter ++)
  22. {
  23. cout<<"d["<<iter-d.begin()<<"] = "<<(*iter)<<", ";
  24. }
  25. cout<<endl;
  26. }
  27. void main()
  28. {
  29. //创建deque
  30. deque<int> d1;                          //创建一个没有任何元素的deque对象
  31. deque<int> d2(10);                      //创建一个具有10个元素的deque对象,每个元素值为默认
  32. deque<double> d3(10, 5.5);              //创建一个具有10个元素的deque对象,每个元素的初始值为5.5
  33. deque<double> d4(d3);                   //通过拷贝一个deque对象的元素值, 创建一个新的deque对象
  34. //初始化赋值:同vector一样,使用尾部插入函数push_back()
  35. for (int i = 1; i < 6 ; i++)
  36. d1.push_back(i*10);
  37. //遍历元素: 1-下标方式 2-迭代器方式 反向遍历(略)
  38. cout<<"printDeque(d1) : "<<endl;
  39. printDeque(d1);
  40. //元素插入:尾部插入用push_back(),头部插入用push_front(),其它位置插入用insert(&pos, elem)
  41. cout<<"d1.push_front(100): "<<endl;
  42. d1.push_front(100);
  43. printDeque(d1);
  44. cout<<"d1.insert(d1.begin()+3, 200): "<<endl; //支持随机存取(即[]操作符),所以begin()可以+3
  45. d1.insert(d1.begin()+2,200);
  46. printDeque(d1);
  47. //元素删除 尾部删除用pop_back();头部删除用pop_front();
  48. //任意迭代位置或迭代区间上的元素删除用erase(&pos)/erase(&first, &last);删除所有元素用clear();
  49. cout<<"d1.pop_front(): "<<endl;
  50. d1.pop_front();
  51. printDeque(d1);
  52. cout<<"d1.erase(d1.begin()+1): "<<endl;
  53. d1.erase(d1.begin()+1); //删除第2个元素d1[1]
  54. printDeque(d1);
  55. cout<<"d1.erase(d1.begin(), d1.begin() + 2) = "<<endl;
  56. d1.erase(d1.begin(), d1.begin() + 2);
  57. printDeque(d1);
  58. cout<<"d1.clear() :"<<endl;
  59. d1.clear();
  60. printDeque(d1);
  61. }

[cpp] view
plain
copyprint?

  1. /*deque: 是一个double-ended queue,
  2. 1)支持随即存取,也就是[]操作符,
  3. 2)支持两端操作,push(pop)-back(front),在两端操作上与list效率差不多
  4. 因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
  5. 1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
  6. 2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
  7. 3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。
  8. */
  9. #include <iostream>
  10. #include <deque>
  11. using namespace std;
  12. void printDeque(const deque<int>& d)
  13. {
  14. cout<<"\n使用下标:\n";
  15. for (unsigned int i = 0; i < d.size(); i++)
  16. {
  17. cout<<"d["<<i<<"] = "<<d[i]<<", ";
  18. }
  19. cout<<"\n使用迭代器\n";
  20. deque<int>::const_iterator iter = d.begin();
  21. for (;iter != d.end(); iter ++)
  22. {
  23. cout<<"d["<<iter-d.begin()<<"] = "<<(*iter)<<", ";
  24. }
  25. cout<<endl;
  26. }
  27. void main()
  28. {
  29. //创建deque
  30. deque<int> d1;                          //创建一个没有任何元素的deque对象
  31. deque<int> d2(10);                      //创建一个具有10个元素的deque对象,每个元素值为默认
  32. deque<double> d3(10, 5.5);              //创建一个具有10个元素的deque对象,每个元素的初始值为5.5
  33. deque<double> d4(d3);                   //通过拷贝一个deque对象的元素值, 创建一个新的deque对象
  34. //初始化赋值:同vector一样,使用尾部插入函数push_back()
  35. for (int i = 1; i < 6 ; i++)
  36. d1.push_back(i*10);
  37. //遍历元素: 1-下标方式 2-迭代器方式 反向遍历(略)
  38. cout<<"printDeque(d1) : "<<endl;
  39. printDeque(d1);
  40. //元素插入:尾部插入用push_back(),头部插入用push_front(),其它位置插入用insert(&pos, elem)
  41. cout<<"d1.push_front(100): "<<endl;
  42. d1.push_front(100);
  43. printDeque(d1);
  44. cout<<"d1.insert(d1.begin()+3, 200): "<<endl; //支持随机存取(即[]操作符),所以begin()可以+3
  45. d1.insert(d1.begin()+2,200);
  46. printDeque(d1);
  47. //元素删除 尾部删除用pop_back();头部删除用pop_front();
  48. //任意迭代位置或迭代区间上的元素删除用erase(&pos)/erase(&first, &last);删除所有元素用clear();
  49. cout<<"d1.pop_front(): "<<endl;
  50. d1.pop_front();
  51. printDeque(d1);
  52. cout<<"d1.erase(d1.begin()+1): "<<endl;
  53. d1.erase(d1.begin()+1); //删除第2个元素d1[1]
  54. printDeque(d1);
  55. cout<<"d1.erase(d1.begin(), d1.begin() + 2) = "<<endl;
  56. d1.erase(d1.begin(), d1.begin() + 2);
  57. printDeque(d1);
  58. cout<<"d1.clear() :"<<endl;
  59. d1.clear();
  60. printDeque(d1);
  61. }

4 容器适配器:stack

(1)可用 vector, list, deque来实现

(2)缺省情况下,用deque实现

template<classT, class Cont = deque<T> >

class stack {    …..    };

(3)用 vector和deque实现,比用list实现性能好

(4)stack是后进先出的数据结构,

(5)只能插入、删除、访问栈顶的元素的操作:  push:     插入元素pop:       弹出元素      top: 返回栈顶元素的引用

测试代码如下:

[cpp] view
plain
copyprint?

  1. <SPAN style="FONT-SIZE: 16px">#include <iostream>
  2. #include <Stack>
  3. using namespace std;
  4. void main()
  5. {
  6. stack<double> s;//可以是各种数据类型;
  7. for( int i=0; i < 10; i++ )
  8. s.push(i);
  9. while(!s.empty())
  10. {
  11. printf("%lf\n",s.top());
  12. s.pop();
  13. }
  14. cout << "the size of  s: " << s.size() << endl;
  15. }
  16. </SPAN>

[cpp] view
plain
copyprint?

  1. <span style="font-size:16px">#include <iostream>
  2. #include <Stack>
  3. using namespace std;
  4. void main()
  5. {
  6. stack<double> s;//可以是各种数据类型;
  7. for( int i=0; i < 10; i++ )
  8. s.push(i);
  9. while(!s.empty())
  10. {
  11. printf("%lf\n",s.top());
  12. s.pop();
  13. }
  14. cout << "the size of  s: " << s.size() << endl;
  15. }
  16. </span>

5 deque

可以用 list和deque实现,缺省情况下用deque实现

template<class T, class Cont = deque<T>>

class queue {  …  };

FIFO先进先出的数据结构,也有push,pop,top函数,但是push发生在队尾,pop,top发生在队头,

示例代码如下:

[cpp] view
plain
copyprint?

  1. /************************************************************************/
  2. /*
  3. 详细用法:
  4. 定义一个queue的变量     queue<Type> M
  5. 查看是否为空范例        M.empty()    是的话返回1,不是返回0;
  6. 从已有元素后面增加元素   M.push()
  7. 输出现有元素的个数      M.size()
  8. 显示第一个元素          M.front()
  9. 显示最后一个元素        M.back()
  10. 清除第一个元素          M.pop()
  11. */
  12. /************************************************************************/
  13. #include <iostream>
  14. #include <queue>
  15. #include <assert.h>
  16. using namespace std;
  17. int main()
  18. {
  19. queue <int> myQ;
  20. int i;
  21. cout<< "现在 queue 是否 empty? "<< myQ.empty() << endl;
  22. for( i =0; i<10 ; i++)
  23. {
  24. myQ.push(i);
  25. }
  26. for( i=0; i<myQ.size(); i++)
  27. {
  28. printf("myQ.size():%d\n",myQ.size());
  29. cout << myQ.front()<<endl;
  30. myQ.pop();
  31. }
  32. system("PAUSE");
  33. return 0;
  34. }

[cpp] view
plain
copyprint?

  1. /************************************************************************/
  2. /*
  3. 详细用法:
  4. 定义一个queue的变量     queue<Type> M
  5. 查看是否为空范例        M.empty()    是的话返回1,不是返回0;
  6. 从已有元素后面增加元素   M.push()
  7. 输出现有元素的个数      M.size()
  8. 显示第一个元素          M.front()
  9. 显示最后一个元素        M.back()
  10. 清除第一个元素          M.pop()
  11. */
  12. /************************************************************************/
  13. #include <iostream>
  14. #include <queue>
  15. #include <assert.h>
  16. using namespace std;
  17. int main()
  18. {
  19. queue <int> myQ;
  20. int i;
  21. cout<< "现在 queue 是否 empty? "<< myQ.empty() << endl;
  22. for( i =0; i<10 ; i++)
  23. {
  24. myQ.push(i);
  25. }
  26. for( i=0; i<myQ.size(); i++)
  27. {
  28. printf("myQ.size():%d\n",myQ.size());
  29. cout << myQ.front()<<endl;
  30. myQ.pop();
  31. }
  32. system("PAUSE");
  33. return 0;
  34. }

二 常用算法

1  count()and  count_if()

count()在序列中统计某个值出现的次数

count_if()在序列中统计与某谓词匹配的次数

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <functional>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7. void CountFuc()
  8. {
  9. const int VECTOR_SIZE = 8 ;
  10. // Define a template class vector of strings
  11. typedef vector<string > StringVector ;
  12. //Define an iterator for template class vector of strings
  13. typedef StringVector::iterator StringVectorIt ;
  14. StringVector NamesVect(VECTOR_SIZE) ;   //vector containing names
  15. string value("Sea") ;  // stores the value used
  16. // to count matching elements
  17. StringVectorIt start, end, it ;
  18. int result = 0 ;   // stores count of elements
  19. // that match value.
  20. // Initialize vector NamesVect
  21. NamesVect[0] = "She" ;
  22. NamesVect[1] = "Sells" ;
  23. NamesVect[2] = "Sea" ;
  24. NamesVect[3] = "Shells" ;
  25. NamesVect[4] = "by" ;
  26. NamesVect[5] = "the" ;
  27. NamesVect[6] = "Sea" ;
  28. NamesVect[7] = "Shore" ;
  29. start = NamesVect.begin() ;   // location of first
  30. // element of NamesVect
  31. end = NamesVect.end() ;       // one past the location
  32. // last element of NamesVect
  33. // print content of NamesVect
  34. cout << "NamesVect { " ;
  35. for(it = start; it != end; it++)
  36. cout << *it << " " ;
  37. cout << " }\n" << endl ;
  38. // Count the number of elements in the range [first, last +1)
  39. // that match value.
  40. result = count(start, end, value) ;
  41. // print the count of elements that match value
  42. cout << "Number of elements that match \"Sea\" = "
  43. << result << endl  ;
  44. }
  45. int MatchFirstChar( const string& str)
  46. {
  47. string s("S") ;
  48. return s == str.substr(0,1) ;
  49. }
  50. void CountIfFuc()
  51. {
  52. const int VECTOR_SIZE = 8 ;
  53. // Define a template class vector of strings
  54. typedef vector<string > StringVector ;
  55. //Define an iterator for template class vector of strings
  56. typedef StringVector::iterator StringVectorIt ;
  57. StringVector NamesVect(VECTOR_SIZE) ;   //vector containing names
  58. StringVectorIt start, end, it ;
  59. int result = 0 ;   // stores count of elements
  60. // that match value.
  61. // Initialize vector NamesVect
  62. NamesVect[0] = "She" ;
  63. NamesVect[1] = "Sells" ;
  64. NamesVect[2] = "Sea" ;
  65. NamesVect[3] = "Shells" ;
  66. NamesVect[4] = "by" ;
  67. NamesVect[5] = "the" ;
  68. NamesVect[6] = "Sea" ;
  69. NamesVect[7] = "Shore" ;
  70. start = NamesVect.begin() ;   // location of first
  71. // element of NamesVect
  72. end = NamesVect.end() ;       // one past the location
  73. // last element of NamesVect
  74. // print content of NamesVect
  75. cout << "NamesVect { " ;
  76. for(it = start; it != end; it++)
  77. cout << *it << " " ;
  78. cout << " }\n" << endl ;
  79. // Count the number of elements in the range [first, last +1)
  80. // that start with letter ‘S‘
  81. result = count_if(start, end, MatchFirstChar) ;
  82. // print the count of elements that start with letter ‘S‘
  83. cout << "Number of elements that start with letter \"S\" = "
  84. << result << endl  ;
  85. }
  86. void main()
  87. {
  88. CountFuc();
  89. CountIfFuc();
  90. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <functional>
  4. #include <string>
  5. #include <vector>
  6. using namespace std;
  7. void CountFuc()
  8. {
  9. const int VECTOR_SIZE = 8 ;
  10. // Define a template class vector of strings
  11. typedef vector<string > StringVector ;
  12. //Define an iterator for template class vector of strings
  13. typedef StringVector::iterator StringVectorIt ;
  14. StringVector NamesVect(VECTOR_SIZE) ;   //vector containing names
  15. string value("Sea") ;  // stores the value used
  16. // to count matching elements
  17. StringVectorIt start, end, it ;
  18. int result = 0 ;   // stores count of elements
  19. // that match value.
  20. // Initialize vector NamesVect
  21. NamesVect[0] = "She" ;
  22. NamesVect[1] = "Sells" ;
  23. NamesVect[2] = "Sea" ;
  24. NamesVect[3] = "Shells" ;
  25. NamesVect[4] = "by" ;
  26. NamesVect[5] = "the" ;
  27. NamesVect[6] = "Sea" ;
  28. NamesVect[7] = "Shore" ;
  29. start = NamesVect.begin() ;   // location of first
  30. // element of NamesVect
  31. end = NamesVect.end() ;       // one past the location
  32. // last element of NamesVect
  33. // print content of NamesVect
  34. cout << "NamesVect { " ;
  35. for(it = start; it != end; it++)
  36. cout << *it << " " ;
  37. cout << " }\n" << endl ;
  38. // Count the number of elements in the range [first, last +1)
  39. // that match value.
  40. result = count(start, end, value) ;
  41. // print the count of elements that match value
  42. cout << "Number of elements that match \"Sea\" = "
  43. << result << endl  ;
  44. }
  45. int MatchFirstChar( const string& str)
  46. {
  47. string s("S") ;
  48. return s == str.substr(0,1) ;
  49. }
  50. void CountIfFuc()
  51. {
  52. const int VECTOR_SIZE = 8 ;
  53. // Define a template class vector of strings
  54. typedef vector<string > StringVector ;
  55. //Define an iterator for template class vector of strings
  56. typedef StringVector::iterator StringVectorIt ;
  57. StringVector NamesVect(VECTOR_SIZE) ;   //vector containing names
  58. StringVectorIt start, end, it ;
  59. int result = 0 ;   // stores count of elements
  60. // that match value.
  61. // Initialize vector NamesVect
  62. NamesVect[0] = "She" ;
  63. NamesVect[1] = "Sells" ;
  64. NamesVect[2] = "Sea" ;
  65. NamesVect[3] = "Shells" ;
  66. NamesVect[4] = "by" ;
  67. NamesVect[5] = "the" ;
  68. NamesVect[6] = "Sea" ;
  69. NamesVect[7] = "Shore" ;
  70. start = NamesVect.begin() ;   // location of first
  71. // element of NamesVect
  72. end = NamesVect.end() ;       // one past the location
  73. // last element of NamesVect
  74. // print content of NamesVect
  75. cout << "NamesVect { " ;
  76. for(it = start; it != end; it++)
  77. cout << *it << " " ;
  78. cout << " }\n" << endl ;
  79. // Count the number of elements in the range [first, last +1)
  80. // that start with letter ‘S‘
  81. result = count_if(start, end, MatchFirstChar) ;
  82. // print the count of elements that start with letter ‘S‘
  83. cout << "Number of elements that start with letter \"S\" = "
  84. << result << endl  ;
  85. }
  86. void main()
  87. {
  88. CountFuc();
  89. CountIfFuc();
  90. }

2 find and  find_if

find       在序列中找出某个值的第一次出现的位置

find_if     在序列中找出符合某谓词的第一个元素

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <algorithm>
  2. #include <iostream>
  3. using namespace std;
  4. void FindFuc()
  5. {
  6. const int ARRAY_SIZE = 8 ;
  7. int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ;
  8. int *location ;   // stores the position of the first
  9. // matching element.
  10. int i ;
  11. int value = 4 ;
  12. // print content of IntArray
  13. cout << "IntArray { " ;
  14. for(i = 0; i < ARRAY_SIZE; i++)
  15. cout << IntArray[i] << ", " ;
  16. cout << " }" << endl ;
  17. // Find the first element in the range [first, last + 1)
  18. // that matches value.
  19. location = find(IntArray, IntArray + ARRAY_SIZE, value) ;
  20. //print the matching element if any was found
  21. if (location != IntArray + ARRAY_SIZE)  // matching element found
  22. cout << "First element that matches " << value
  23. << " is at location " << location - IntArray << endl;
  24. else                                    // no matching element was
  25. // found
  26. cout << "The sequence does not contain any elements"
  27. << " with value " << value << endl ;
  28. }
  29. int IsOdd( int n)
  30. {
  31. return n % 2 ;
  32. }
  33. void FindIfFuc()
  34. {
  35. const int ARRAY_SIZE = 8 ;
  36. int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ;
  37. int *location ;   // stores the position of the first
  38. // element that is an odd number
  39. int i ;
  40. // print content of IntArray
  41. cout << "IntArray { " ;
  42. for(i = 0; i < ARRAY_SIZE; i++)
  43. cout << IntArray[i] << ", " ;
  44. cout << " }" << endl ;
  45. // Find the first element in the range [first, last -1 ]
  46. // that is an odd number
  47. location = find_if(IntArray, IntArray + ARRAY_SIZE, IsOdd) ;
  48. //print the location of the first element
  49. // that is an odd number
  50. if (location != IntArray + ARRAY_SIZE)  // first odd element found
  51. cout << "First odd element " << *location
  52. << " is at location " << location - IntArray << endl;
  53. else         // no odd numbers in the range
  54. cout << "The sequence does not contain any odd numbers"
  55. << endl ;
  56. }
  57. void main()
  58. {
  59. FindFuc();
  60. FindIfFuc();
  61. }

[cpp] view
plain
copyprint?

  1. #include <algorithm>
  2. #include <iostream>
  3. using namespace std;
  4. void FindFuc()
  5. {
  6. const int ARRAY_SIZE = 8 ;
  7. int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ;
  8. int *location ;   // stores the position of the first
  9. // matching element.
  10. int i ;
  11. int value = 4 ;
  12. // print content of IntArray
  13. cout << "IntArray { " ;
  14. for(i = 0; i < ARRAY_SIZE; i++)
  15. cout << IntArray[i] << ", " ;
  16. cout << " }" << endl ;
  17. // Find the first element in the range [first, last + 1)
  18. // that matches value.
  19. location = find(IntArray, IntArray + ARRAY_SIZE, value) ;
  20. //print the matching element if any was found
  21. if (location != IntArray + ARRAY_SIZE)  // matching element found
  22. cout << "First element that matches " << value
  23. << " is at location " << location - IntArray << endl;
  24. else                                    // no matching element was
  25. // found
  26. cout << "The sequence does not contain any elements"
  27. << " with value " << value << endl ;
  28. }
  29. int IsOdd( int n)
  30. {
  31. return n % 2 ;
  32. }
  33. void FindIfFuc()
  34. {
  35. const int ARRAY_SIZE = 8 ;
  36. int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ;
  37. int *location ;   // stores the position of the first
  38. // element that is an odd number
  39. int i ;
  40. // print content of IntArray
  41. cout << "IntArray { " ;
  42. for(i = 0; i < ARRAY_SIZE; i++)
  43. cout << IntArray[i] << ", " ;
  44. cout << " }" << endl ;
  45. // Find the first element in the range [first, last -1 ]
  46. // that is an odd number
  47. location = find_if(IntArray, IntArray + ARRAY_SIZE, IsOdd) ;
  48. //print the location of the first element
  49. // that is an odd number
  50. if (location != IntArray + ARRAY_SIZE)  // first odd element found
  51. cout << "First odd element " << *location
  52. << " is at location " << location - IntArray << endl;
  53. else         // no odd numbers in the range
  54. cout << "The sequence does not contain any odd numbers"
  55. << endl ;
  56. }
  57. void main()
  58. {
  59. FindFuc();
  60. FindIfFuc();
  61. }

3 for_each()

函数声明如下:

template<class InIt, class Fun>
    Fun for_each(InIt first, InIt last, Fun f);

在区间【first,last)上的每个元素执行f操作

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. // prints the cube of integer n
  6. void PrintCube(int n)
  7. {
  8. cout << n * n * n << " " ;
  9. }
  10. void main()
  11. {
  12. const int VECTOR_SIZE = 8 ;
  13. // Define a template class vector of integers
  14. typedef vector<int > IntVector ;
  15. //Define an iterator for template class vector of integer
  16. typedef IntVector::iterator IntVectorIt ;
  17. IntVector Numbers(VECTOR_SIZE) ;   //vector containing numbers
  18. IntVectorIt start, end, it ;
  19. int i ;
  20. // Initialize vector Numbers
  21. for (i = 0; i < VECTOR_SIZE; i++)
  22. Numbers[i] = i + 1 ;
  23. start = Numbers.begin() ;   // location of first
  24. // element of Numbers
  25. end = Numbers.end() ;       // one past the location
  26. // last element of Numbers
  27. // print content of Numbers
  28. cout << "Numbers { " ;
  29. for(it = start; it != end; it++)
  30. cout << *it << " " ;
  31. cout << " }\n" << endl ;
  32. // for each element in the range [first, last)
  33. // print the cube of the element
  34. for_each(start, end, PrintCube) ;
  35. cout << "\n\n" ;
  36. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. // prints the cube of integer n
  6. void PrintCube(int n)
  7. {
  8. cout << n * n * n << " " ;
  9. }
  10. void main()
  11. {
  12. const int VECTOR_SIZE = 8 ;
  13. // Define a template class vector of integers
  14. typedef vector<int > IntVector ;
  15. //Define an iterator for template class vector of integer
  16. typedef IntVector::iterator IntVectorIt ;
  17. IntVector Numbers(VECTOR_SIZE) ;   //vector containing numbers
  18. IntVectorIt start, end, it ;
  19. int i ;
  20. // Initialize vector Numbers
  21. for (i = 0; i < VECTOR_SIZE; i++)
  22. Numbers[i] = i + 1 ;
  23. start = Numbers.begin() ;   // location of first
  24. // element of Numbers
  25. end = Numbers.end() ;       // one past the location
  26. // last element of Numbers
  27. // print content of Numbers
  28. cout << "Numbers { " ;
  29. for(it = start; it != end; it++)
  30. cout << *it << " " ;
  31. cout << " }\n" << endl ;
  32. // for each element in the range [first, last)
  33. // print the cube of the element
  34. for_each(start, end, PrintCube) ;
  35. cout << "\n\n" ;
  36. }

4 unique

unique --常用来删除重复的元素,将相邻的重复的元素移到最后,返回一个iterator指向最后的重复元素,所以用它来删除重复元素时必须先排序

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6. void main()
  7. {
  8. string str;
  9. vector<string> words;
  10. while(cin>>str&&str!="#")
  11. {
  12. words.push_back(str);
  13. }
  14. sort(words.begin(),words.end());
  15. vector<string>::iterator end_unique =
  16. unique(words.begin(),words.end());
  17. words.erase(end_unique,words.end());
  18. vector<string> ::iterator ite=words.begin();
  19. for(;ite!=words.end();ite++)
  20. {
  21. cout<<*ite<<"   ";
  22. }
  23. cout<<endl;
  24. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <string>
  5. using namespace std;
  6. void main()
  7. {
  8. string str;
  9. vector<string> words;
  10. while(cin>>str&&str!="#")
  11. {
  12. words.push_back(str);
  13. }
  14. sort(words.begin(),words.end());
  15. vector<string>::iterator end_unique =
  16. unique(words.begin(),words.end());
  17. words.erase(end_unique,words.end());
  18. vector<string> ::iterator ite=words.begin();
  19. for(;ite!=words.end();ite++)
  20. {
  21. cout<<*ite<<"   ";
  22. }
  23. cout<<endl;
  24. }

5 常用排序算法

常用排列算法如下:

1 sort    对给定区间所有元素进行排序

2 stable_sort  对给定区间所有元素进行稳定排序

3 partial_sort  对给定区间所有元素部分排序

4 partial_sort_copy 对给定区间复制并排序

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <VECTOR>
  6. using namespace std;
  7. const int N=10;
  8. void print(const vector<int>& v)
  9. {
  10. vector<int>::const_iterator ite=v.begin();
  11. for(;ite!=v.end();ite++)
  12. {
  13. cout<<*ite<<"  ";
  14. }
  15. cout<<endl;
  16. }
  17. void Create(vector<int>& v)
  18. {
  19. srand((unsigned int)time(NULL));
  20. v.resize(N);
  21. for(int i=0;i<N;i++)
  22. v[i]=rand()%100;
  23. }
  24. // bool cmp(int arg1,int arg2)
  25. // {
  26. //  return arg1<arg2;
  27. // }
  28. void sort1(vector<int> v)
  29. {
  30. sort(v.begin(),v.end());
  31. cout<<"after sort funtion:\n";
  32. print(v);
  33. }
  34. void sort2(vector<int> v)
  35. {
  36. stable_sort(v.begin(),v.end());
  37. cout<<"after stable_sort funtion:\n";
  38. print(v);
  39. }
  40. void sort3(vector<int> v)
  41. {
  42. partial_sort(v.begin(),v.begin()+v.size()/2,v.end()); //对前半部分排序
  43. cout<<"after partial_sort funtion:\n";
  44. print(v);
  45. }
  46. void sort4(vector<int> v)
  47. {
  48. vector<int> temp;
  49. temp.resize(v.size());
  50. partial_sort_copy(v.begin(),v.end(),temp.begin(),temp.end()); //复制并排序
  51. cout<<"after partial_sort_copy funtion:\n";
  52. print(temp);
  53. }
  54. void main()
  55. {
  56. vector<int> v;
  57. Create(v);
  58. cout<<"before sort:\n";
  59. print(v);
  60. sort1(v);
  61. sort2(v);
  62. sort3(v);
  63. sort4(v);
  64. }

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <VECTOR>
  6. using namespace std;
  7. const int N=10;
  8. void print(const vector<int>& v)
  9. {
  10. vector<int>::const_iterator ite=v.begin();
  11. for(;ite!=v.end();ite++)
  12. {
  13. cout<<*ite<<"  ";
  14. }
  15. cout<<endl;
  16. }
  17. void Create(vector<int>& v)
  18. {
  19. srand((unsigned int)time(NULL));
  20. v.resize(N);
  21. for(int i=0;i<N;i++)
  22. v[i]=rand()%100;
  23. }
  24. // bool cmp(int arg1,int arg2)
  25. // {
  26. //  return arg1<arg2;
  27. // }
  28. void sort1(vector<int> v)
  29. {
  30. sort(v.begin(),v.end());
  31. cout<<"after sort funtion:\n";
  32. print(v);
  33. }
  34. void sort2(vector<int> v)
  35. {
  36. stable_sort(v.begin(),v.end());
  37. cout<<"after stable_sort funtion:\n";
  38. print(v);
  39. }
  40. void sort3(vector<int> v)
  41. {
  42. partial_sort(v.begin(),v.begin()+v.size()/2,v.end()); //对前半部分排序
  43. cout<<"after partial_sort funtion:\n";
  44. print(v);
  45. }
  46. void sort4(vector<int> v)
  47. {
  48. vector<int> temp;
  49. temp.resize(v.size());
  50. partial_sort_copy(v.begin(),v.end(),temp.begin(),temp.end()); //复制并排序
  51. cout<<"after partial_sort_copy funtion:\n";
  52. print(temp);
  53. }
  54. void main()
  55. {
  56. vector<int> v;
  57. Create(v);
  58. cout<<"before sort:\n";
  59. print(v);
  60. sort1(v);
  61. sort2(v);
  62. sort3(v);
  63. sort4(v);
  64. }

6 生成全排列

next_permutation()的原型如下:

template<class BidirectionalIterator>

bool next_permutation(

BidirectionalIterator _First,

BidirectionalIterator _Last

);

template<class BidirectionalIterator, class BinaryPredicate>

bool next_permutation(

BidirectionalIterator _First,

BidirectionalIterator _Last,

BinaryPredicate _Comp

);

两个重载函数,第二个带谓词参数_Comp,其中只带两个参数的版本,默认谓词函数为"小于".,返回值为bool类型

示例代码如下:

[cpp] view
plain
copyprint?

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. void permutation(char* str,int length)
  5. {
  6. sort(str,str+length);
  7. do
  8. {
  9. for(int i=0;i<length;i++)
  10. cout<<str[i];
  11. cout<<endl;
  12. }while(next_permutation(str,str+length));
  13. }
  14. int main(void)
  15. {
  16. char str[] = "acb";
  17. cout<<str<<"所有全排列的结果为:"<<endl;
  18. permutation(str,3);
  19. system("pause");
  20. return 0;
  21. }
时间: 2024-10-10 17:35:19

常用STL容器及算法举例的相关文章

ACM常用STL容器

1 // STL(标准模板库),由三大部分组成:容器,算法,迭代器 2 3 4 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) 5 // function object(仿函数),adaptor(适配器),allocator(空间适配器) 6 7 // STL容器 8 9 // vector 10 // deque(双端数组) 11 // stack 12 // queue 13 // list(链表模型) 14 // priotry_qu

ACM竞赛常用STL(一)

全排列函数next_permutation STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include <algorithm> using namespace std; 调用: next_permutation(start, end); 注意:函数要求输入的是一个升序排列的序列的头指针和尾指针. 用法: 1 // 数组 2 int a[N]; 3 sort(a, a+N); 4 next_permutation(a, a+N); 5 // 向量 6 vector

【C/C++学院】0828-STL入门与简介/STL容器概念/容器迭代器仿函数算法STL概念例子/栈队列双端队列优先队列/数据结构堆的概念/红黑树容器

STL入门与简介 #include<iostream> #include <vector>//容器 #include<array>//数组 #include <algorithm>//算法 using namespace std; //实现一个类模板,专门实现打印的功能 template<class T> //类模板实现了方法 class myvectorprint { public: void operator ()(const T &

《STL源码剖析》——第五、六:关联容器与算法

第五章.关联容器  5.0.关联容器 标准的STL关联式容器分为set(集合)和map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和multimap(多键映射表).这些容器的底层机制均以RB-tree(红黑树)完成.RB-tree也是一个独立容器,但并不开放给外界使用. SGISTL还提供了一个不在标准规格之列的关联式容器:hash_table (散列表),以及以此hash_table为底层机制而完成的hash_set(散列集合).hash_map(散列映射表).hash_

STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数

 1.STL(Standard Template Library,是用泛型技术来设计完成的实例)的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器) STL的六大组件分别是: 容器(Container) 算法(Algorithm) 迭代器(Iterator) 仿函数(Function object) 适配器(Adapter) 空间配置器(allocator):只能分配内存等 2.容器与算法 案例如下: #include<

C++笔记(6):标准模板库STL:容器、迭代器和算法

STL(Standard Template Library)是C++标准库的一部分.STL的代码从广义上讲分为三类:容器.迭代器和算法. 1.容器 2.迭代器 3.算法  -------------------------------------------------------------------------------------------------------------------------- 1.容器 顺序容器容器是特定类型对象的集合.顺序容器为程序员提供控制元素存储和访问

6.5-数据结构&amp;算法-标准模板STL/STL容器/向量

一.标准模板库(STL) 1.定义了一系列的容器模板,实现泛型化的数据结构. 1)向量(vector),内存连续,支持下标访问和随机迭代,只有在尾部进行插入和删除效率才比较高. 2)列表(list),内存不连续,不支持下标访问和随机迭代,在任何位置进行插入和删除效率都很高. 3)双端队列(deque),内存连续,支持下标访问和随机迭代,在首尾两端进行插入和删除效率都比较高. 以上三种合称为线性容器. 4)堆栈(stack),后进先出 5)队列(queue),先进先出 6)优先队列(priorit

stl容器学习——queue,stack,list与string

目录 string stack queue list 点击上面的内容可以实现跳转哦 简介:本文记录了对string list queue stack四个容器的学习总结,包含有四种容器常用的函数介绍和一些使用过程中碰到的细节总结,在list容器中介绍了迭代器的使用. 头文件 想要用哪一种容器,就要加上对应的头文件 比如想要使用queue , 就要加上 #include<queue> 以此类推,想要使用STL库中的容器,只要加上它们的头文件就好. string 目录部分 1.string的定义及初

游戏制作中的大宝剑---常用的数据结构与算法

前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为了方便大家阅读,个人认为比较重要的内容-------红色字体显示 个人认为可以了解的内容-------紫色字体显示 --------------------------------------------------------------------------- ---------------------------------