Solved

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

Posted on 2000-03-25
4
244 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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

705 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

17 Experts available now in Live!

Get 1:1 Help Now