Iterator: Peek-Funktion?



  • Sorry für den Titel wusste es nicht anders zu beschreiben.
    Kann man bei einem Iterator sehen was an nächster Stelle kommt ohne ihn zu kopieren?
    Grund ist, dass ich eine Liste übergeben bekomme, welche Felder zu einer SQL-Tabelle enthält. Und beim letzten Parameter bevor it == list.end() ist, muss ich das komma weglassen.
    Jetzt könnte ich den iterator jede Schleife kopieren und inkrementieren und kucken wo er hinzeigt. Aber das scheint mir nicht so ganz perfekt zu sein.

    int NLSqlite::createTable( const std::string& name, const NLSQLTableDescriptor::TTableList& lst )
    {
    	if (m_db != NULL)
    	{
    		int result = 0;
    		char* err = NULL;
    		std::stringstream sql;
    		sql << "create table " << name << " (";
    
    		NLSQLTableDescriptor::TTableList::const_iterator it = lst.begin();
    		for ( it; it != lst.end(); it++ )
    		{
    			const NLSQLTableDescriptor& field = *it;
    			sql << field.getName() << " " << getFieldDescriptionByType(field.getType());
    			sql << ", ";
    		}
    		sql << ");";
    		result = sqlite3_exec(m_db, sql.str().c_str(), sqlite_callback, this, &err);
    		if ( result != SQLITE_OK )
    		{
    			NLError("[NLSqlite] Unable to create table '" + name + std::string("'. Message from SQLite3: '") + err + std::string("'."));
    			NLError("[NLSqlite] SQL-String was: " + sql.str());
    		}	
    		sqlite3_free(err);
    		return result;
    	}
    	NLError("[NLSqlite] Cannot create a table with no database opened.");
    	return -1;
    }
    


  • Du kannst auch ab den zweiten Schleifendurchlauf vor ql << field.getName() << " " << getFieldDescriptionByType(field.getType()); ein Komma setzen.



  • Rhombicosidodecahedron schrieb:

    Du kannst auch ab den zweiten Schleifendurchlauf vor ql << field.getName() << " " << getFieldDescriptionByType(field.getType()); ein Komma setzen.

    Hmpf, daran habe ich natürlich nicht gedacht. 🕶 👍

    int NLSqlite::createTable( const std::string& name, const NLSQLTableDescriptor::TTableList& lst )
    {
    	if (m_db != NULL)
    	{
    		int result = 0;
    		char* err = NULL;
    		std::stringstream sql;
    		sql << "create table " << name << " (";
    
    		NLSQLTableDescriptor::TTableList::const_iterator it = lst.begin();
    		for ( it; it != lst.end(); it++ )
    		{
    			if ( it != lst.begin() )
    			{
    				sql << ", ";
    			}	
    
    			const NLSQLTableDescriptor& field = *it;
    			sql << field.getName() << " " << getFieldDescriptionByType(field.getType());				
    		}		
    		sql << ");";
    		result = sqlite3_exec(m_db, sql.str().c_str(), sqlite_callback, this, &err);
    		if ( result != SQLITE_OK )
    		{
    			NLError("[NLSqlite] Unable to create table '" + name + std::string("'. Message from SQLite3: '") + err + std::string("'."));
    			NLError("[NLSqlite] SQL-String was: " + sql.str());
    		}	
    		sqlite3_free(err);
    		return result;
    	}
    	NLError("[NLSqlite] Cannot create a table with no database opened.");
    	return -1;
    }
    

    Danke :).



  • if((it + 1) == v.end())
    

    ist das nächste Element das ende?



  • HighLigerBiMBam schrieb:

    if((it + 1) == v.end())
    

    ist das nächste Element das ende?

    Okay, so einfach.. manchmal vergesse ich die einfachsten Dinge. Schäme mich jetzt schon fast. :D.
    Aber danke.



  • Seit wann hat ein list-iterator einen operator + ? Oder ist das doch keine Liste?



  • Nur Random-Access-Iteratoren haben einen + Operator. Es gibt noch die Funktion advance, die einen Iterator n-mal inkrementieren kann, die wäre eventuell geeignet. Aber sie kopiert letztlich den Iterator auch bloß, und das schien ja nicht die bevorzugte Lösung zu sein. Und bei Input-Iteratoren funktioniert es auch nicht. Ich könnte mir vorstellen, dass man im Datenbankumfeld öfters mal mit Input/Output-Iteratoren zu tun hat.



  • Ich weiß das alles. Weiters kopiert advance den Iterator nicht. http://www.cplusplus.com/reference/std/iterator/advance/



  • 314159265358979 schrieb:

    Seit wann hat ein list-iterator einen operator + ? Oder ist das doch keine Liste?

    Blöde Sache habe ich nicht drauf geachtet, dass list nur einen Bidirektionalen-Iterator hat...



  • 314159265358979 schrieb:

    Ich weiß das alles.

    Ich wollte dich nicht belehren. Mein Posting war überhaupt nicht an dich gerichtet.

    Weiters kopiert advance den Iterator nicht.

    OK. Dann muss man halt selbst kopieren, in jedem Fall löst es das Problem nicht wirklich. Allerdings kommt man um das Kopieren so oder so nicht herum, it+1 ist ja auch nur eine Kopie...



  • Ich hab den Ansatz von Rhombicosidodecahedron genommen. Der ist der einfachste.


Anmelden zum Antworten