Solved

Can push_back() and end() be made to be efficient within vectors?

Posted on 2000-03-25
4
245 Views
Last Modified: 2013-12-14
//  This code can be found at:  http://waldo.wi.mit.edu/~kstanley/STL/ex4.cc
//
//  I am not sure whether my set of objects of class Contig (defined
//  below) will require efficient removal.  If not, I would like to
//  avoid the linked list overhead and just store them as a vector.
//  Hence I wrote the following code which uses a common subset of
//  list and vector:  push_back(), end() and erase().
//
//  My hope is that if erase() is sufficiently infrequent (possibly
//  never used) that this will generate efficient vector code.
//  But, if it turns out that I need to use erase(), I can switch to
//  lists effortlessly.
//
//  I look forward to your thoughts on this.  Do you think that
//  this can be made to run efficiently when I use vectors?
//
//  I have compiled this with and without -DUSELISTS on gcc 2.8.1,
//  cxx V6.2-024 and a copy of stlport downloaded within the past week.
//

class Contig {
 public:
};

#ifdef USELISTS
#include <list>
#define STL_TYPE list
#else
#include <vector>
#define STL_TYPE vector
#endif

main(){

  STL_TYPE<Contig> AllContigs;   // STL_TYPE is vector or list

  AllContigs.push_back( Contig() ) ;
  STL_TYPE<Contig>::iterator a = ((AllContigs.end())) ; a--;
 
  AllContigs.push_back( Contig() ) ;
  Contig Ca = *a;

  AllContigs.erase( (a) );
}




Thanks,
  Ken
0
Comment
Question by:klopter
  • 2
4 Comments
 

Author Comment

by:klopter
ID: 2656493
Is there an STL container class which
will only offer me to intersection of
the vector and list container classes?

Thanks,
  Ken
0
 
LVL 22

Expert Comment

by:nietod
ID: 2656585
First of all, what I usually like to do in this case is to make the container a data member of a class that I defined.  I find that gives you the most amount to encapsulation.  Then if I need to change the container, I just change the data member and some of the class's member functions, I don't have to change any of the code that uses the class.  Does that make sense?
0
 
LVL 22

Accepted Solution

by:
nietod earned 75 total points
ID: 2656603
So I would do something more like

class ContigContainer
{
  list<Contig> CntLst;
public:
   void AddContig(const Contig &C) { CntLst.push_back(C); };
};

But my 2nd concern is the statement

>> I would like to avoid the linked list overhead and
>> just store them as a vector.
It is not necesserally true tha a vector will have less overhead.   A vector will usually use less memory, but not necessarily have less overhead.  A vector will defintely give you better random access than a list, i.e you can quickly get to the xth item in a vector, while in a list that requires sequentially searching the list.  However it is usually faster to add to or delete from a list than a vector  (Especialy if you don't know ahead of time the ultimate size the vector will reach.)  So which is better will definitely depend on what you are going to be doing?  The main considerations are do youi need random (as oposed to sequential) access and will you be doing a lot of additions and deletions (especially if you can't figure out the total number of additions before doing them.)
0
 

Expert Comment

by:maxd128
ID: 2657686
If you use container only as a set of objects without care about order you can remove objects by replacing deleted object with object from the end of vector.
If you need ordering use set or multiset with comparison operator based on sequence in which objects were added.

Note about code: after adding to container new element presaved iterator can become invalid.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

932 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now