C Board  

Go Back   C Board > General Programming Boards > C++ Programming

Reply
 
LinkBack Thread Tools Display Modes
Old 04-15-2008, 09:35 AM   #1
Registered User
 
Join Date: Nov 2006
Posts: 184
How properly get data out of vectors of templates?

How would I do this?

I want to be able to handle vectors of many different types of data and vectors that can contain any number of other vectors of data.

Currently, I have a templated function that handles vectors of vectors of <typename T> (which could be anything from int to vectors of something else). As well, I have specialized/overloaded functions to handle the single-level vectors of data (e.g. vector<string>). So the templated function only handles vectors of vectors of....whatever and then as it loops down to the last vector of data, it "passes" it off to the overloaded specialized functions.

My problem is that the way I'm currently doing this creates extra uselss objects and thus isn't clean/efficient. I can't seem to figure out how to properly narrow down the vectors.

Code:
vector<int>* convert(SomeClass obj)
{
	//Return vector
	vector<int>* retVector = new vector<int>();
	
	//Get the values
	int* values = ...elided...
	
	//Put into vector
	retVector->assign( values, values + length );
	
	//Clean up
	delete values;
	
	return retVector;
}

vector<vector<int> >* convert(SomeClass obj, vector<int> spec)
{
	//Length of array
	int length = GetArrayLength( obj );
	
	//Return vector
	vector<vector<int> >* retVector = new vector<vector<int> >();
	
	//Get all inner arrays
	for ( int i = 0; i < length; i++ ) 
	{
		//Create an inner vector
		vector<int>* innerVector;
		
		//Now get the element of the outer SomeOtherClass Array
		SomeOtherClass otherObj = ...elided...
		
		//Set data
		innerVector = convert( env, otherObj );
		
		//Add it to the outer vector
		retVector->push_back( *innerVector );
		
		//Clean up
		delete innerVector;
	}
	
	return retVector;
}

template <typename T>
vector<vector<T> >* convert(SomeClass obj, vector<T> spec)
{
	//Length of array
	int length = GetArrayLength( obj );
	
	//Return array
	vector<vector<T> >* T = new vector<vector<T> >();
	
	//Set all inner arrays
	for ( int i = 0; i < length; i++ ) 
	{
		//Create an inner vector
		vector<T>* innerVector;
		
		//use this to narrow down to eventually the specialized function
		T subSpec; 
		
		//Now get the element
		SomeOtherClass otherObj = ...elided... 
		
		//Convert inner data
		innerVector = convert( env, otherObj, subSpec );
		
		//Add it to the outer vector
		T->push_back( *innerVector );
		
		//Clean up refs
		delete innerVector;
	}
	
	return T;
}

int main()
{
	vector<vector<string> >* ret = convert( env, o2, vector<string>() );
	
	//Print out results
	for ( vector<vector<string> >::const_iterator it = ret->begin(); it != ret->end(); ++it )
	{
		vector<string> vec = *it;
		for ( vector<string>::const_iterator vecIt = vec.begin(); vecIt != vec.end(); ++ivecIt )
		{
			printf( ( ( *vecIt ) + "\n" ).c_str() );
		}
	}
}
6tr6tr is offline   Reply With Quote
Old 04-15-2008, 09:49 AM   #2
Senior software engineer
 
brewbuck's Avatar
 
Join Date: Mar 2007
Location: Portland, OR
Posts: 5,381
Way too much going on there.

Code:
template <typename T>
void drill_down(const vector<T> &vec_p)
{
    for(typename vector<T>::const_iterator i = vec_p.begin(), end = vec_p.end(); i != end; ++i)
        drill_down(*i);
}

template <typename T>
void drill_down(const T &elem_p)
{
    // Base case
}
brewbuck is offline   Reply With Quote
Old 04-15-2008, 10:17 AM   #3
Registered User
 
Join Date: Nov 2006
Posts: 184
Quote:
Originally Posted by brewbuck View Post
Way too much going on there.

Code:
template <typename T>
void drill_down(const vector<T> &vec_p)
{
    for(typename vector<T>::const_iterator i = vec_p.begin(), end = vec_p.end(); i != end; ++i)
        drill_down(*i);
}

template <typename T>
void drill_down(const T &elem_p)
{
    // Base case
}
Thanks for the reply! When i try the above, it only sends it to the first &elem_p function.

Code:
vector<vector<vector<string> > > vec;

//This sends it to element function
drill_down( &vec );

//All of these can't find matching function
//drill_down<vector<vector<vector<string> > > >( &vec );
//drill_down<vector<vector<string> > >( &vec );

Last edited by 6tr6tr; 04-15-2008 at 10:22 AM.
6tr6tr is offline   Reply With Quote
Old 04-15-2008, 10:19 AM   #4
Senior software engineer
 
brewbuck's Avatar
 
Join Date: Mar 2007
Location: Portland, OR
Posts: 5,381
You're passing a pointer, which is not what the function expects. Get rid of that '&'
brewbuck is offline   Reply With Quote
Old 04-15-2008, 10:35 AM   #5
Registered User
 
Join Date: Nov 2006
Posts: 184
Quote:
Originally Posted by brewbuck View Post
You're passing a pointer, which is not what the function expects. Get rid of that '&'
Thanks but it still didn't work until I changed the element function to be a specialized one (in this case for string) and then it can find it properly. Thanks for all your help i think this is going to lead to a nice solution to my problem!
6tr6tr is offline   Reply With Quote
Reply

Thread Tools
Display Modes

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Queue with templates pobri19 C++ Programming 6 09-23-2008 06:06 AM
Binary Tree, couple questions scoobasean C Programming 3 03-12-2005 09:09 PM
C Programming Question TK A Brief History of Cprogramming.com 13 07-04-2002 07:11 PM
How do I base size of arrays on annother number? Dual-Catfish C++ Programming 15 09-25-2001 01:31 PM


All times are GMT -6. The time now is 05:00 AM.


Powered by vBulletin® Version 3.8.1
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.3.0 RC2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22