C++/Data Structure/List — различия между версиями

Материал из C\C++ эксперт
Перейти к: навигация, поиск
м (1 версия: Импорт контента...)
 
(нет различий)

Текущая версия на 10:24, 25 мая 2010

A list splicing example.

#include <iostream>
#include <list>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
  list<string> sentence;
  list<string> phrase;
  list<string>::iterator p;
  
  string s1[] = {"A", "B", ""};
  string s2[] = {"C", "D", ""};
  string s3[] = {"E", "F", "G.", ""};
  string s4[] = {"A", "C,", "E", "G", ""};
  int i;
  for(i = 0; s1[ i ] != ""; i++)
    sentence.push_back(s1[i]);

  for(i = 0; s2[ i ] != ""; i++)
    phrase.push_back(s2[ i ]);
  cout << "Original sentence:\n";
  p = sentence.begin();
  while(p != sentence.end())
    cout << *p++ << " ";
  cout << endl;
  sentence.splice(sentence.begin(), phrase);
  cout << "Sentence after splicing at the front:\n";
  p = sentence.begin();
  while(p != sentence.end())
    cout << *p++ << " ";
  cout << endl;
  for(i = 0; s3[ i ] != ""; i++)
    phrase.push_back(s3[ i ]);
  sentence.splice(sentence.end(), phrase);
  cout << "Sentence after splicing at the end:\n";
  p = sentence.begin();
  while(p != sentence.end())
    cout << *p++ << " ";
  cout << endl;
  for(i = 0; s4[ i ] != ""; i++)
    phrase.push_back(s4[ i ]);

  p = find(sentence.begin(), sentence.end(), "or");
  sentence.splice(p, phrase);
  cout << "Sentence after splicing in the middle:\n";
  p = sentence.begin();
  while(p != sentence.end())
    cout << *p++ << " ";
  return 0;
}


An example of the transform algorithm.

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int xform(int i) {
  return i * i;
}
int main()
{
  list<int> listObject;
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back(i);
  cout << "Original contents of listObject: ";
  list<int>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  p = transform(listObject.begin(), listObject.end(), listObject.begin(), xform);
  cout << "Transformed contents of listObject: ";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Copy a list to a vector.

#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
  vector<char> v(20);
  list<char> listObject;
  int i;
  for(i = 0; i <20; i++) 
     v[i] = "A" + i;
  cout << "Original contents of vector:\n";
  for(i = 0; i <v.size(); i++) 
     cout << v[i] << " ";
  cout << "\n\n";
  char str[] = "-STL Power-";
  for(i = 0; str[i]; i++) 
     listObject.push_back(str[i]);
  copy(listObject.begin(), listObject.end(), v.begin());
  // display result
  cout << "Contents of vector after copy:\n";
  for(i = 0; i <v.size(); i++) 
     cout << v[i] << " ";
  return 0;
}


Create a reciprocal function object.

#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;
// A simple function object.
class reciprocal: unary_function<double, double> {
public:
  result_type operator()(argument_type i) { 
    return (result_type) 1.0/i; // return reciprocal
  }
};
int main()
{
  list<double> listObject;
  int i;
  for(i = 1; i <10; i++) 
     listObject.push_back((double)i);
  cout << "Original contents of listObject:\n";
  list<double>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  // use reciprocal function object
  // call function object
  p = transform(listObject.begin(), listObject.end(), listObject.begin(), reciprocal()); 
  cout << "Transformed contents of listObject:\n";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Define class and store in a list

#include <iostream>
#include <list>
#include <cstring>
using namespace std;
class Project {
public:
  char name[40];
  int duration;
  Project() { 
    strcpy(name, "");
    duration = 0;
  }
  Project(char *n, int d) {
    strcpy(name, n);
    duration = d;
  }
  void add_days(int i) {
    duration += i;
  }
  void sub_days(int i) {
    duration -= i;
  }
  bool completed() { 
     return !duration; 
  }
 
  void report() {
    cout << name << ": ";
    cout << duration;
    cout << " days left.\n";
  }
};
bool operator<(const Project &a, const Project &b)
{
  return a.duration < b.duration;
}
bool operator>(const Project &a, const Project &b)
{
  return a.duration > b.duration;
}
bool operator==(const Project &a, const Project &b)
{
  return a.duration == b.duration;
}
bool operator!=(const Project &a, const Project &b)
{
  return a.duration != b.duration;
}
int main()
{
  list<Project> proj;
  proj.push_back(Project("Project 1", 35));
  proj.push_back(Project("Project 2", 190));
  proj.push_back(Project("Project 3", 1000));
  list<Project>::iterator p = proj.begin();
  while(p != proj.end()) {
    p->report();
    p++;
  }
  p = proj.begin();
  p->add_days(10);
  do {
    p->sub_days(5);
    p->report();
  } while (!p->completed());
  return 0;
}


Demonstrate advance() and distance() in list

#include <iostream>
#include <list>
#include <iterator>
using namespace std;
int main()
{
  list<char> listObject;
  list<char>::iterator p;
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back("A"+i);
  p = listObject.begin(); 
  cout << "Character at p: " << *p << endl;
  // move two characters forward using advance()
  advance(p, 2);
  cout << "Character at p+2: " << *p << endl;
  cout << "Number of elements from listObject.begin() ";
  cout << "to listObject.end(): ";
  cout << distance(listObject.begin(), listObject.end());
  return 0;
}


Demonstrate bind2nd().

#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;
int main()
{
  list<int> listObject;
  list<int>::iterator p, endp;
  int i;
  for(i =1; i < 20; i++) 
     listObject.push_back(i);
  cout << "Original sequence:\n";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
  endp = remove_if(listObject.begin(), listObject.end(), bind2nd(greater<int>(), 8));
  cout << "Resulting sequence:\n";
  p = listObject.begin();
  while(p != endp) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Demonstrate merge() in list

#include <iostream>
#include <list>
using namespace std;
 
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i = 0; i <10; i+=2) 
    listObject1.push_back(i);
  for(i =1; i <11; i+=2) 
    listObject2.push_back(i);
  cout << "Original size of listObject1: ";
  cout << listObject1.size() << endl;
  cout << "Original contents of listObject1:\n";
  list<int>::iterator p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  cout << "Original size of listObject2: ";
  cout << listObject2.size() << endl;
  cout << "Original contents of listObject2:\n";
  p = listObject2.begin();
  while(p != listObject2.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  // merge the two lists
  listObject1.merge(listObject2);
  cout << "Size of listObject1 after merge: ";
  cout << listObject1.size() << endl;
  cout << "Merged contents of listObject1:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  cout << "listObject2 is now empty, its size is ";
  cout << listObject2.size() << endl;
  return 0;
}


Demonstrate remove() in list

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject;
  list<int>::iterator p;
  int i;
  for(i = 0; i < 20; i++) 
     listObject.push_back(i%3);
  cout << "Original list: ";
  for(p = listObject.begin(); p != listObject.end(); p++)
    cout << *p << " ";
  cout << endl;
  listObject.remove(1); // remove all 1"s
  cout << "Modified list: ";
  for(p = listObject.begin(); p != listObject.end(); p++)
    cout << *p << " ";
  cout << endl;
  return 0;
}


Demonstrate unique() in list

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject;
  list<int>::iterator p;
  for(int i = 0; i < 5; i++)
    for(int j = 0; j < 3; j++) 
       listObject.push_back(i);
  cout << "Orignal list: ";
  for(p = listObject.begin(); p != listObject.end(); p++)
    cout << *p << " ";
  cout << endl;
  listObject.unique(); // remove consecutive duplicates
  cout << "Modified list: ";
  for(p = listObject.begin(); p != listObject.end(); p++)
    cout << *p << " ";
  cout << endl;
  return 0;
}


Demonstrate virtual functons: list interface

#include <iostream>
#include <cstdlib>
#include <cctype>
using namespace std;
class list {
public:
  list *head;             // pointer to start of list
  list *tail;             // pointer to end of list 
  list *next;             // pointer to next item
  int num;                // value to be stored
  list() { 
     head = tail = next = NULL; 
  }
  virtual void store(int i) = 0;
  virtual int retrieve() = 0;
};
class queue : public list {
public:
  void store(int i);
  int retrieve();
};
void queue::store(int i)
{
  list *item;
  item = new queue;
  if(!item) {
    cout << "Allocation error.\n";
    exit(1);
  }
  item->num = i;
  if(tail) 
     tail->next = item;
  tail = item;
  item->next = NULL;
  if(!head) 
     head = tail;
}
int queue::retrieve()
{
  int i;
  list *p;
  if(!head) {
    cout << "List empty.\n";
    return 0;
  }
  // remove from start of list
  i = head->num;
  p = head;
  head = head->next;
  delete p;
  return i;
}
class stack : public list {
public:
  void store(int i);
  int retrieve();
};
void stack::store(int i)
{
  list *item;
  item = new stack;
  if(!item) {
    cout << "Allocation error.\n";
    exit(1);
  }
  item->num = i;
  if(head) 
     item->next = head;
  head = item;
  if(!tail) 
     tail = head;
}
int stack::retrieve()
{
  int i;
  list *p;
  if(!head) {
    cout << "List empty.\n";
    return 0;
  }
  // remove from start of list
  i = head->num;
  p = head;
  head = head->next;
  delete p;
  return i;
}
int main()
{
  list *p;
  // demonstrate queue
  queue queueObject;
  p = &queueObject; // point to queue
  p->store(1);
  p->store(2);
  p->store(3);
  cout << "Queue: ";
  cout << p->retrieve();
  cout << p->retrieve();
  cout << p->retrieve();
  cout << "\n";
  // demonstrate stack
  stack stackObject;
  p = &stackObject; // point to stack
  p->store(1);
  p->store(2);
  p->store(3);
  cout << "Stack: ";
  cout << p->retrieve();
  cout << p->retrieve();
  cout << p->retrieve();
  cout << "\n";
  return 0;
}


Difference between push_back() and push_front()

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i=0; i<10; i++) listObject1.push_back(i);
  for(i=0; i<10; i++) listObject2.push_front(i);
  list<int>::iterator p;
  cout << "Contents of listObject1:\n";
  p = listObject1.begin(); 
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  cout << "Contents of listObject2:\n";
  p = listObject2.begin(); 
  while(p != listObject2.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Elements can be put on the front or end of a list.

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<char> listObject;
  list<char> revlistObject;
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back("A"+i);
  cout << "Size of listObject = " << listObject.size() << endl;
  cout << "Original contents: ";
  list<char>::iterator p;
  
  
  while(!listObject.empty()) {
    p = listObject.begin();
    cout << *p;
    listObject.pop_front();
    revlistObject.push_front(*p);
  }
  cout << endl << endl;
  
  cout << "Size of revlistObject = ";
  cout << revlistObject.size() << endl;
  cout << "Reversed contents: ";
  p = revlistObject.begin();
  while(p != revlistObject.end()) {
    cout << *p;
    p++;
  }
    
  return 0;
}


end() in list.

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject; // an empty list
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back(i);
  cout << "List printed forwards:\n";
  list<int>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n";
  cout << "List printed backwards:\n";
  p = listObject.end();
  while(p != listObject.begin()) {
    p--;
    cout << *p << " ";
  }
  return 0;
}


List basics: push, begin, end pop

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<char> listObject;
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back("A"+i);
  cout << "Size = " << listObject.size() << endl;
  list<char>::iterator p;
  cout << "Contents: ";
  while(!listObject.empty()) {
    p = listObject.begin();
    cout << *p;
    listObject.pop_front();
  }
  
  return 0;
}


Merge and splice lists.

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<char> listObject1, listObject2, listObject3;
  int i;
  for(i = 0; i <10; i+=2) 
     listObject1.push_back(i + "A");
  for(i =1; i <11; i+=2) 
     listObject2.push_back(i + "A");
  cout << "Contents of listObject1:\n";
  list<char>::iterator p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  cout << "Contents of listObject2:\n";
  p = listObject2.begin();
  while(p != listObject2.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  
  listObject1.merge(listObject2);               // now, merge the two lists
  if(listObject2.empty())
    cout << "listObject2 is now empty\n";
  cout << "Contents of listObject1 after merge:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  char str[] = "-splicing-";
  for(i = 0; str[i]; i++) 
     listObject3.push_back(str[i]);
  cout << "Contents of listObject3:\n";
  p = listObject3.begin();
  while(p != listObject3.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  
  p = listObject1.begin();
  while(p != listObject1.end()) {
    if(*p == "F") listObject1.splice(p, listObject3);
    p++;
  }
  cout << "Contents of listObject1 after splice:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Merge into descending order.

#include <iostream>
#include <list>
using namespace std;
 
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i = 10; i >= 0; i -= 2) 
    listObject1.push_back(i);
  for(i = 11; i >= 1; i -= 2) 
    listObject2.push_back(i);
  cout << "Original contents of listObject1:\n";
  list<int>::iterator p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  cout << "Original contents of listObject2:\n";
  p = listObject2.begin();
  while(p != listObject2.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  // merge using greater than, not less than
  listObject1.merge(listObject2, greater<int>());
  cout << "Merged contents of listObject1:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  return 0;
}


Merge two lists.

 
#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i = 0; i < 10; i += 2) 
     listObject1.push_back(i);
  for(i =1; i < 11; i+=2) 
     listObject2.push_back(i);
  cout << "Contents of listObject1:\n";
  list<int>::iterator p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl << endl;
  cout << "Contents of listObject2:\n";
  p = listObject2.begin();
  while(p != listObject2.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl << endl;
  
  listObject1.merge(listObject2);
  if(listObject2.empty())
    cout << "listObject2 is now empty\n";
  cout << "Contents of listObject1 after merge:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Merging One List with Another

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i=0; i<10; i+=2) listObject1.push_back(i);
  for(i=1; i<11; i+=2) listObject2.push_back(i);
  cout << "Contents of listObject1:\n";
  list<int>::iterator p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl << endl;
  cout << "Contents of listObject2:\n";
  p = listObject2.begin();  while(p != listObject2.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl << endl;
  // now, merge the two lists
  listObject1.merge(listObject2);
  if(listObject2.empty())
    cout << "listObject2 is now empty\n";
  cout << "Contents of listObject1 after merge:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Merging won"t work if the lists aren"t ordered.

#include <iostream>
#include <list>
using namespace std;
 
int main()
{
  list<int> listObject1, listObject2;
  int i;
  listObject1.push_back(2);
  listObject1.push_back(0);
  listObject1.push_back(8);
  listObject1.push_back(4);
  listObject1.push_back(6);
  for(i =1; i <11; i+=2) 
    listObject2.push_back(i);
  cout << "Original contents of listObject1:\n";
  list<int>::iterator p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  cout << "Original contents of listObject2:\n";
  p = listObject2.begin();
  while(p != listObject2.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  // this merge will fail
  listObject1.merge(listObject2);
  cout << "Contents of listObject1 after failed merge:\n";
  p = listObject1.begin();
  while(p != listObject1.end()) 
    cout << *p++ << " ";
  cout << "\n\n";
  return 0;
}


Push value in the list

#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;
int main()
{
  list<double> vals;
  int i;
  for(i =1; i <10; i++) 
     vals.push_back((double)i);
  cout << "Original contents of vals:\n";
  list<double>::iterator p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  p = transform(vals.begin(), vals.end(), vals.begin(), negate<double>()); 
  cout << "Negated contents of vals:\n";
  p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Sort a list.

#include <iostream>
#include <list>
#include <cstdlib>
using namespace std;
int main()
{
  list<int> listObject;
  int i;
  for(i = 0; i < 10; i++)
    listObject.push_back(rand());
  cout << "Original contents:\n";
  list<int>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl << endl;

  listObject.sort();
  
  cout << "Sorted contents:\n";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  
  return 0;
}


Store class objects in a list.

#include <iostream>
#include <list>
#include <cstring>
using namespace std;
class myclass {
  int a, b;
  int sum;
public:
  myclass() { 
     a = b = 0; 
  }
  myclass(int i, int j) {
    a = i;
    b = j;
    sum = a + b;
  }
  int getsum() { 
     return sum; 
  }
  friend bool operator<(const myclass &object1, const myclass &object2);
  friend bool operator>(const myclass &object1, const myclass &object2);
  friend bool operator==(const myclass &object1, const myclass &object2);
  friend bool operator!=(const myclass &object1, const myclass &object2);
};
bool operator<(const myclass &object1, const myclass &object2)
{
  return object1.sum < object2.sum;
}
bool operator>(const myclass &object1, const myclass &object2)
{
  return object1.sum > object2.sum;
}
bool operator==(const myclass &object1, const myclass &object2)
{
  return object1.sum == object2.sum;
}
bool operator!=(const myclass &object1, const myclass &object2)
{
  return object1.sum != object2.sum;
}
int main()
{
  int i;
  list<myclass> listObject1;
  for(i = 0; i < 10; i++) 
     listObject1.push_back(myclass(i, i));
  cout << "First list: ";
  list<myclass>::iterator p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  cout << endl;
  list<myclass> listObject2;
  for(i = 0; i < 10; i++) 
     listObject2.push_back(myclass(i*2, i*3));
  cout << "Second list: ";
  p = listObject2.begin();
  while(p != listObject2.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  cout << endl;
  
  listObject1.merge(listObject2);
  
  cout << "Merged list: ";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  return 0;
}


Storing Class Objects in a List

#include <iostream>
#include <list>
#include <cstring>
using namespace std;
class myclass {
  int a, b;
  int sum;
public:
  myclass() { a = b = 0; }
  myclass(int i, int j) {
    a = i;
    b = j;
    sum = a + b;
  }
  int getsum() { return sum; }
  friend bool operator<(const myclass &object1,
                        const myclass &object2);
  friend bool operator>(const myclass &object1,
                        const myclass &object2);
  friend bool operator==(const myclass &object1,
                        const myclass &object2);
  friend bool operator!=(const myclass &object1,
                        const myclass &object2);
};
bool operator<(const myclass &object1, const myclass &object2)
{
  return object1.sum < object2.sum;
}
bool operator>(const myclass &object1, const myclass &object2)
{
  return object1.sum > object2.sum;
}
bool operator==(const myclass &object1, const myclass &object2)
{
  return object1.sum == object2.sum;
}
bool operator!=(const myclass &object1, const myclass &object2)
{
  return object1.sum != object2.sum;
}
int main()
{
  int i;
  // create first list
  list<myclass> listObject1;
  for(i=0; i<10; i++) listObject1.push_back(myclass(i, i));
  cout << "First list: ";
  list<myclass>::iterator p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  cout << endl;
  // create a second list
  list<myclass> listObject2;
  for(i=0; i<10; i++) listObject2.push_back(myclass(i*2, i*3));
  cout << "Second list: ";
  p = listObject2.begin();
  while(p != listObject2.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  cout << endl;
  // now, merget listObject1 and listObject2
  listObject1.merge(listObject2);
  // display merged list
  cout << "Merged list: ";
  p = listObject1.begin();
  while(p != listObject1.end()) {
    cout << p->getsum() << " ";
    p++;
  }
  return 0;
}


The difference between push_back() and push_front().

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject1, listObject2;
  int i;
  for(i = 0; i < 10; i++) 
     listObject1.push_back(i);
     
  for(i = 0; i < 10; i++) 
     listObject2.push_front(i);
  
  list<int>::iterator p;
  
  cout << "Contents of listObject1:\n";
  p = listObject1.begin();  
  while(p != listObject1.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n";
  cout << "Contents of listObject2:\n";
  p = listObject2.begin();  
  while(p != listObject2.end()) {
    cout << *p << " ";
    p++;
  }
    
  return 0;
}


Transform algorithm based on list.

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
double reciprocal(double i) {
  return 1.0/i;
}
int main()
{
  list<double> listObject;
  int i;
  for(i =1; i < 10; i++) 
     listObject.push_back((double)i);
  cout << "Original contents of listObject:\n";
  list<double>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  // transform listObject
  p = transform(listObject.begin(), listObject.end(), listObject.begin(), reciprocal);
  cout << "Transformed contents of listObject:\n";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Traverse a List Using an Iterator

      #include <iostream>
      #include <list>
      using namespace std;
 
      typedef list<int> IntegerList;
      int main()
      {
          IntegerList    intList;
          for (int i = 1; i <= 10; ++i)
             intList.push_back(i * 2);
          for (IntegerList::const_iterator ci = intList.begin(); ci != intList.end(); ++ci)
             cout << *ci << " ";
          return 0;
      }


Understanding end() in List

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject; // create an empty list
  int i;
  for(i=0; i<10; i++) listObject.push_back(i);
  cout << "List printed forwards:\n";
  list<int>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  cout << "List printed backwards:\n";
  p = listObject.end();
  while(p != listObject.begin()) {
    p--; // decrement pointer before using
    cout << *p << " ";
  }
  return 0;
}


Use a binary function object in list "transform"

#include <iostream>
#include <list>
#include <functional>
#include <algorithm>
using namespace std;
int main()
{
  list<double> vals;
  list<double> divisors;
  int i;
  for(i =10; i <100; i+=10) 
     vals.push_back((double)i);
  for(i =1; i <10; i++) 
     divisors.push_back(3.0);
  cout << "Original contents of vals:\n";
  list<double>::iterator p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }
  cout << endl;
 
  p = transform(vals.begin(), 
                vals.end(),
                divisors.begin(), 
                vals.begin(),
                divides<double>()); // use function object
  cout << "Divided contents of vals:\n";
  p = vals.begin();
  while(p != vals.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Use ostream_iterator for string

#include <iostream>
#include <list>
#include <iterator>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
  list<string> listObject;
  ostream_iterator<string> out_it(cout);
  listObject.push_back("Stream ");
  listObject.push_back("iterators ");
  listObject.push_back("are ");
  listObject.push_back("useful.");
  copy(listObject.begin(), listObject.end(), out_it);
  return 0;
}


Using a list: push_back, begin, end, size

#include <iostream>
#include <list>
using namespace std;
int main()
{
  list<int> listObject; 
  int i;
  for(i = 0; i <10; i++) 
     listObject.push_back(i);
  cout << "Size = " << listObject.size() << endl;
  cout << "Contents: ";
  list<int>::iterator p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  cout << "\n\n";
  p = listObject.begin();
  while(p != listObject.end()) {
    *p = *p + 100;
    p++;
  }
  cout << "Contents modified: ";
  p = listObject.begin();
  while(p != listObject.end()) {
    cout << *p << " ";
    p++;
  }
  return 0;
}


Using a list to store mailing addresses.

#include <iostream>
#include <list>
#include <string>
using namespace std;
class Address {
  string name;
  string street;
  string city;
  string state;
  string zip;
public:
  Address() {
    name = street = city = state = zip = "";
  }
  Address(string n, string s, string c, string st, string z) {
    name = n;
    street = s;
    city = c;
    state = st;
    zip = z;
  }
  string getname() { 
     return name; 
  }
  string getcity() { 
     return city; 
  }
  string getstreet() { 
     return street; 
  }
  string getstate() { 
     return state; 
  }
  string getzip() { 
     return zip; 
  }
};
// List sorted by name.
bool operator<(Address &a, Address &b)
{
  return a.getname() < b.getname();
}
// List searched by name.
bool operator==(Address &a, Address &b)
{
  return a.getname() == b.getname();
}

void display(list<Address> &listObject) {
  list<Address>::iterator p;
  for(p = listObject.begin(); p != listObject.end(); p++) {
    cout << p->getname() << ": ";
    cout << p->getstreet() << ", ";
    cout << p->getcity() << ", ";
    cout << p->getstate() << " ";
    cout << p->getzip() << endl;
  }
}
int main()
{
  list<Address> mlistObjectA, mlistObjectB;
  mlistObjectA.push_back(Address("J", "1102 St", "Mission", "TX", "78572")); 
  mlistObjectA.sort();
  mlistObjectB.sort();
  // merge mailings lists
  mlistObjectA.merge(mlistObjectB);
  cout << "List A after sorting and merging.\n";
  display(mlistObjectA);
  cout << "List A now has " << mlistObjectA.size();
  cout << " entries.\n";
  // remove duplicates
  mlistObjectA.unique();
  cout << "List A after removing duplicates.\n";
  display(mlistObjectA);
  cout << "List A now has " << mlistObjectA.size();
  cout << " entries.\n";
  return 0;
}


Using an arrays as a container

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
  list<int> listObject(10);
  list<int>::iterator p;
  int *ip, *ip_end;
  int nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  int i;
  cout << "Initial contents of nums: ";
  for(i = 0; i <10; i++) 
    cout << nums[ i ] << " ";
  cout << endl;

  copy(nums, &nums[9], listObject.begin());    // copy nums array to list
  cout << "Contents of listObject after copy: ";
  for(p=listObject.begin(); p!=listObject.end(); p++)
    cout << *p << " ";
  cout << endl;
  ip_end = remove_copy_if(listObject.begin(),   // remove elements that are less than 5
                          listObject.end(),
                          nums, 
                          bind2nd(less<int>(), 
                          5));
  cout << "Contents of nums after remove_copy_if(): ";
  for(ip=nums; ip!=ip_end; ip++)
    cout << *ip << " ";
  return 0;
}


Using reverse() to create a palindrome tester.

#include <iostream>
#include <list>
using namespace std;
char phrases[][80] = {
  "Madam, I"m Adam.",
  "Able was I ere I saw Elba.",
  "A man, a plan, a canal: Panama!",
  "This is not one.",
  ""
};
int main()
{
  list<char> pal;
  int i, j;
  list<char>::iterator p;
  for(i = 0; *phrases[ i ]; i++) {
    for(j = 0; phrases[ i ][ j ]; j++) 
      pal.push_back(phrases[ i ][ j ]);
    cout << "Phrase # " << i << " forward: ";
    p = pal.begin();
    while(p != pal.end()) cout << *p++;
    cout << endl;
    // remove extraneous characters
    pal.remove(",");
    pal.remove(".");
    pal.remove("!");
    pal.remove(":");
    pal.remove("\"");
    pal.remove(" ");
    cout << "Phrase # " << i << " after deletions: ";
    p = pal.begin();
    while(p != pal.end()) 
       cout << *p++;
    cout << endl;
    pal.reverse(); // reverse the list
    cout << "Phrase # " << i << " backward:        ";
    p = pal.begin();
    while(p != pal.end()) 
       cout << *p++;
    cout << endl;
    pal.clear(); // get ready to try next phrase
  }
  return 0;
}