现在的位置: 首页 > 综合 > 正文

STL的心得(3)---运用(控制台)

2011年10月06日 ⁄ 综合 ⁄ 共 11999字 ⁄ 字号 评论关闭

很多网上介绍的都是关于STL在控制台的运用,我认为,这总适合与学习理论知识以及其实践,当真正用到项目中去的

恐怕这就不适合了。我也老套一下。分为两种情况。

1)控制台的运用

2)用MFC写一个简单的画图程序(恐怕这个应该是大家更加注意的)

OK,先说控制台:

下面源代码,可以直接运行(VC6 Console)(关于其整个工程文件可以到www.confach.533.net去Download),如果你找不到,可以直接按上面的联系方式与我Mail,我会尽快给你发过去,大家一起学习)

#ifdef _MSC_VER

#endif

#include "stdafx.h"

#pragma warning(disable:4786)

#pragma warning(disable:4514)

#include <vector>

#include <iostream>

#include <deque>

#include <list>

#include <set>

#include <map>

#include <algorithm>

#include <string>

#include <iosfwd>

#include <iterator>

using namespace std;

class PrintInt

{

public:

 void operator()(int elem) const

 {

  std::cout< }

};

//define a class

class StudentID

{

public:

 StudentID(int id=0)

 {

  value=id;

  std::cout<<"Assigning student id:"< }

 ~StudentID()

 {

  std::cout<<"Destructing ID:"< }

private:

 int value;

};

class Student

{

public:

 Student(char *pName="noName",int ssID=0):id(ssID)

 {

  std::cout<<"Constructing student:"<   strncpy(name,pName,sizeof(name));

  name[sizeof(name)-1]=0;

  StudentID id(ssID);

 }

private:

 char name[20];

 StudentID id;

};

void TestMMap()

{

 typedef multimap IntStringMap;

 IntStringMap coll;

// coll.insert(std::make_pair(5,"tagged"));

// coll.insert(make_pair(2,"a"));

// coll.insert(make_pair(1,"this"));

// coll.insert(make_pair(4,"of"));

// coll.insert(make_pair(6,"strings"));

// coll.insert(make_pair(1,"is"));

// coll.insert(make_pair(3,"multimap"));

// 

 /* print all element values

 *- iterate over all elements

 *- element member second is the value

 */

 std::cout<<"========================================"<// IntStringMap::iterator pos;

//  for (pos = coll.begin(); pos != coll.end(); ++pos)

// {

//  std::cout << pos->second <<"   ";

// }

 std::cout << endl;

 

}

void TestSet()

{

 typedef std::set >IntSet;

  IntSet set1;

 set1.insert(1);

 set1.insert(3);

 set1.insert(5);

 set1.insert(1);

 set1.insert(4);

 set1.insert(6);

 

 std::cout<<"========================================"< IntSet::const_iterator pos;

 for(pos=set1.begin();pos!=set1.end();++pos)

 {

  std::cout<<*pos<<"  "<< "  set"< }

}

void TestAlgorithm()

{

 vector mVector;

 vector::iterator pos;


 mVector.push_back(1);

 mVector.push_back(2);

 mVector.push_back(5);

 mVector.push_back(76);

 mVector.push_back(4);

  std::cout<<"====================================="< for(pos=mVector.begin();pos!=mVector.end();++pos)

 {

  std::cout<<*pos< }

 pos=min_element(mVector.begin(),mVector.end());

 std::cout<<"min:"<<*pos< pos=max_element(mVector.begin(),mVector.end());

 std::cout<<"Max:"<<*pos< std::cout<<"===================================="< std::cout<<"        Sort                        "< std::cout<<"===================================="< std::sort(mVector.begin(),mVector.end());

 for(pos=mVector.begin();pos!=mVector.end();++pos)

 {

  std::cout<<*pos< }

 std::cout<<"===================================="< std::cout<<"         Reverse                       "< std::cout<<"===================================="< std::reverse(mVector.begin(),mVector.end());

 for(pos=mVector.begin();pos!=mVector.end();++pos)

 {

  std::cout<<*pos< }

 

}

void TestIteratorAdapter()

{

 list coll1;

 

 //insert elements from 1 to 9 into the first collection

 for (int i=1; i<=9; ++i)

 {

  coll1.push_back(i);

 }

 

 // copy the elements of coll1 into coll2 by appending

 vector coll2;

 copy (coll1.begin(), coll1.end(), //source

        back_inserter(coll2)); //destination

 

 //copy the elements of coll1 into coll3 by inserting them  front

 // - reverses the order of the elements

 //Remarks:if use front_inserter,the container must provide push_front method

 deque coll3;

 copy (coll1.begin(), coll1.end(), //source

       front_inserter(coll3)); //destination

 

 //copy elements of coll1 into coll4

 

 // - only inserter that works for associative collections

 set coll4;

 copy (coll1.begin(), coll1.end(), //source

       inserter(coll4,coll4.begin())); //destination

 std::cout<<"=====================List=========="< list::iterator pos;

 for(pos=coll1.begin();pos!=coll1.end();++pos)

 {

  std::cout<<*pos< }

 std::cout<<"=====================Vector(List use back_insert)=========="< vector::iterator pos1;

 for(pos1=coll2.begin();pos1!=coll2.end();++pos1)

 {

  std::cout<<*pos1< }

 std::cout<<"=====================Deque(List use front_insert)=========="< deque::iterator pos2;

 for(pos2=coll3.begin();pos2!=coll3.end();++pos2)

 {

  std::cout<<*pos2< }

 std::cout<<"=====================Set(List use inserter)=========="< set::iterator pos3;

 for(pos3=coll4.begin();pos3!=coll4.end();++pos3)

 {

  std::cout<<*pos3< }

}

void TestStreamIterator()

{

 vector coll;

 /*read all words from the standard input

 * - source: all strings until end-of-file (or error)

 * - destination: coll (inserting)

 */

 copy (istream_iterator(cin), //start of source

  istream_iterator(), //end of source

  back_inserter(coll)); //destination

 

 

 //sort elements

 sort (coll.begin(), coll.end());

 /*print all elements without duplicates

 * - source: coll

 * - destination: standard output (with newline between elements)

 */

 unique_copy (coll.begin(), coll.end(), //source

  ostream_iterator (cout, "\n"));

 //destination

}

template
inline void PRINT_ELEMENTS (const T& coll, const char* optcstr="")

{

typename T::const_iterator pos;

std::cout << optcstr<for (pos=coll.begin(); pos!=coll.end(); ++pos) {

std::cout << *pos << ' '<}

std::cout << std::endl;

}

//void main()

//{

//  const int size=100;

//  int array[size];

//  array[0]=0;

//  array[1]=1;

//  array[1000]=1000;

//

//  cout<// 

//}

typedef struct tagIntegerNode {

  int             iValue;

  tagIntegerNode *pNextIntegerNode;

}INTEGERNODE;

class A {

  public:

    // Made public to simplify tracing

    // Would normally be protected:

   static INTEGERNODE *pFirstIntegerNode;

};

// Static data members must be initialized at file scope, even

// if private.

INTEGERNODE *A::pFirstIntegerNode;

class B:public A {

  public:

    B( void );

};

class C:public A {

  public:

    C( void );

};

B::B( void )

{

  pFirstIntegerNode                   = new INTEGERNODE;

  pFirstIntegerNode->iValue           = 1;

  pFirstIntegerNode->pNextIntegerNode = NULL;

};

C::C( void )

{

  pFirstIntegerNode->pNextIntegerNode                   = new INTEGERNODE;

  pFirstIntegerNode->pNextIntegerNode->iValue           = 2;

  pFirstIntegerNode->pNextIntegerNode->pNextIntegerNode = NULL;

};

//----------------------------------------------------

//-----------------------------------------------------

typedef list ListElement;

typedef list OwningList;

void OutputList(const ListElement& EntireListElement,int listNumber)

{

 ostream_iterator out(cout," ");

 cout<<"List "<  copy(EntireListElement.begin(),EntireListElement.end(),out);

 cout<

}

void TestOwningList()

{

 OwningList ListOfListElements;

 for(int i=0;i<3;++i)

 {

  ListElement EntireListElement;

  for(int j=0;j<5;++j)

  {

   EntireListElement.push_back (i*4+j);

  }

  OutputList(EntireListElement,i+1);

  ListOfListElements.push_back(EntireListElement);

 }

 cout< OwningList::iterator it=ListOfListElements.begin();

 for(int j=1;it!=ListOfListElements.end();++it,++j)

 {

     const ListElement& EntireListElement1=*it;

  OutputList(EntireListElement1,j);

 }

 

}

typedef vector INTVECTOR;

void TestVectorAttr1()

{

 // Dynamically allocated vector begins with 0 elements.

  INTVECTOR theVector;

   // Add one element to the end of the vector, an int with the value 42.

   theVector.push_back(42) ;

  // Show statistics about vector.

    cout << "theVector's size is: " << theVector.size() << endl;

    cout << "theVector's maximum size is: " << theVector.max_size()

         << endl;

    cout << "theVector's capacity is: " << theVector.capacity() << endl;

    // Ensure there's room for at least 1000 elements.

    theVector.reserve(1000);

    cout << endl << "After reserving storage for 1000 elements:" << endl;

    cout << "theVector's size is: " << theVector.size() << endl;

    cout << "theVector's maximum size is: " << theVector.max_size()

         << endl;

    cout << "theVector's capacity is: " << theVector.capacity() << endl;

    // Ensure there's room for at least 2000 elements.

    theVector.resize(2000);

    cout << endl << "After resizing storage to 2000 elements:" << endl;

    cout << "theVector's size is: " << theVector.size() << endl;

    cout << "theVector's maximum size is: " << theVector.max_size()

         << endl;

    cout << "theVector's capacity is: " << theVector.capacity() << endl;

}

void TestVectorCreate()

{

 cout<<"============================================="< cout<<"====================Test Vector============="< cout<<"============================================="< INTVECTOR c1;

 c1.push_back(1);

 c1.push_back(2);

 c1.push_back(3);

 c1.push_back(4);

 INTVECTOR::iterator it;

 cout<<"---Create a empty vector without any element"< for(it=c1.begin();it!=c1.end();++it)

 { 

  cout<<*it<<",";

 }

 cout< cout<<"--Create a copy vector"< INTVECTOR c2(c1);

    for(it=c2.begin();it!=c2.end();++it)

 { 

  cout<<*it<<",";

 }

 cout< cout<<"---Create a vector with n elements"< INTVECTOR c3(8);

 c3.assign(8,1);

 c3.push_back(10);

 c3.push_back(12);

 c3.push_back(14);

 c3.push_back(16);

 c3.push_back(18);


   for(it=c3.begin();it!=c3.end();++it)

 { 

  cout<<*it< }

   cout<<"---Create a vector with n copies of elements"<   INTVECTOR c4(5,10);

for(it=c4.begin();it!=c4.end();++it)

 { 

  cout<<*it< }

int nArr[]={1,2,3,4,5};

INTVECTOR c5(nArr,nArr+sizeof(nArr)/sizeof(int));

cout<<"---Create a vector with a array"<for(it=c5.begin();it!=c5.end();++it)

 { 

  cout<<*it< }

cout<<"--Test End----------"<}

void TestVectorIterator()

{

 vector ages(15) ;

 ages.push_back(15);

 vector::const_iterator p=ages.begin();

 for(int i=0;i<10;i++)

 {

  ages.push_back(i);

 }

 cout<<"===========Test Iterator=============="< //p=ages.begin();

 cout<<"The first age is:"<<*p< cout<<"===============End===================="< 

}

class Shape

{

public:

 virtual void Draw()

 {

  cout<<"Draw it in Shape class"< }

 virtual void GetSize()=0;

 

};

class Rectangle:public Shape

{

public :

 virtual void Draw()

 {

  cout<<"Draw it in Rectangle class"< }

   void GetSize()

   

   {

   cout<<"Get size in Rectangle class"<  }

  

};

void TestPointer()

{

 int i=100;

 char c='a';

 float f=i;

 double d=f;

 bool b=true;

 

 int *pI=&i;

 int **ppI=&pI;

 cout<<"Address of i         :0x"<<&i< printf("Address of c         :0x%p\n",&c);

 cout<<"Address of f          :0x"<<&f< cout<<"Address of d          :0x"<<&d<    cout<<"Address of b          :0x"<<&b<

 cout<<"Address of pI          :0x"<<&pI< cout<<"Value of pI          :0x"<  cout<<"Address of ppI          :0x"<<&ppI< cout<<"Value of ppI          :0x"< }

void main()

{

 TestPointer();

 return;

 Shape *pShape=NULL;

 Rectangle a;

 pShape=&a;

 pShape->Draw();

 pShape->GetSize();

 return;

 TestVectorCreate();

 TestVectorAttr1();

 TestVectorIterator();

    return;

 TestOwningList();

 B instanceB;

 C instanceC;

 cout<iValue < cout<pNextIntegerNode->iValue< 

 short int iArray[1000];

 for(int i1=0;i1<1000;i1++)

 {

  iArray[i1]=i1;

 }

 Student s("confach zhang",99471136);

 vectorcol1;

 dequedeq1;

 listlist1;

  

    std::cout<<"=================================================="< std::cout<<"   index      value    Type"< std::cout<<"=================================================="< for(int i=0;i<100;i++)

 {   if(i%2==0)

  col1.push_back(i);

 }

 

 for( i=0;i
 {

 std::cout< }

 std::cout<<"===============Object Function=================="<     for_each(col1.begin(),col1.end(),PrintInt());

 std::cout<<"=================================================="< std::cout<<"   index      value    Type"< std::cout<<"=================================================="< for(i=0;i<100;i++)

 { 

  if(i%2==0)

  {

  deq1.push_front(i);

  }

  else

  {

   deq1.push_back(i);

  }

 }

 for(i=0;i
 {

  std::cout< }

    std::cout<<"=================================================="< std::cout<<"   index      value    Type"< std::cout<<"=================================================="< for(char c='a';c<='z';c++)

 {

  list1.push_back(c);

 }

   while(!list1.empty())

   {

    std::cout<     list1.pop_front();

   }

    std::cout<<"=================================================="< std::cout<<"   index      value    Type"< std::cout<<"=================================================="<    for( c='a';c<='z';c++)

 {

  list1.push_front(c);

 }

 std::cout<<"==============User Define function=========================="< PRINT_ELEMENTS(list1,"confach");

    list::iterator pos;

   //list::const_iterator//for read_only

   //list::iterator//for read/write

   for(pos=list1.begin();pos!=list1.end();++pos)

 //Caution:

// Note that the preincrement operator (prefix ++) is used here. This is because it might have better

//performance than the postincrement operator. The latter involves a temporary object because it

//must return the old position of the iterator. For this reason, it generally is best to prefer ++pos

//over pos++. Thus, you should avoid the following version:

//for (pos = coll.begin(); pos != coll.end(); pos++) {

//                                            ^^^^^ // OK, but slower

//...

//}

//For this reason, I recommend using the preincrement and pre-decrement operators in general.

   {

    std::cout<   }

   TestSet();

   TestMMap();

   TestAlgorithm();

   std::cout<}

 

 

抱歉!评论已关闭.