Vector Problemchen

03/02/2013 01:50 Seife_#1
Code:
int _tmain(int argc, _TCHAR* argv[])
{
	string lvlname;
	char option;
	ifstream input;
	ofstream output;

	cout << "Geben sie den Namen ein."<<endl;
	cin >> lvlname;

	input.open(lvlname + ".txt");

	
	string outputs;
	string temp;
	vector<string> file[6];

	if(input)
	{
		while(!input.eof())
		{
			getline(input, temp);
			file.push_back(temp);
		}
	}

	else
		return -1;
Die Idee hinter diesem Code ist es Zeilen in einen Vector von Strings zu laden. Ich wollte erstmal wissen wie man das korrekt machen würde. Ich weiß dass ist von der Form her noch ziemlich schlecht aber ich frag nach nem besseren Weg wie man das Umsetzen könnte und vor allem die Gründe dafür. Und ich bekomm noch nen compile time error bei " file.push_back(temp);" nämlich
Code:
1>c:\users\seithe\documents\visual studio 2010\projects\test\test\test.cpp(33):
 error C2228: Links von ".push_back" muss sich eine Klasse/Struktur/Union befinden.
Woran liegt das denn ^^ Danke
03/02/2013 01:55 MrSm!th#2
Du machst ein Array von Vektoren und willst dann von diesem die Methode push_back aufrufen. Ein Array hat die logischerweise nicht.
Ich gehe davon aus, dass du einen Vektor der Größe 6 wolltest, richtig?
Das ginge folgendermaßen:
Code:
vector<string> file(6);
Dann sollte es auch gehen. Ein Array von Vektoren wären ja letztendlich 6 einzelne Vektoren und jeder kann mehrere Strings fassen; ich denke nicht, dass du das wolltest.
Falls doch, dann musst du natürlich angeben, welchen Vektor du meintest, sprich
Code:
//z.B. den ersten
file[0].push_back(...);
03/02/2013 02:52 Seife_#3
Doch, genau das war es :) Vielen Dank
03/02/2013 10:19 Schlüsselbein#4
Auch noch ne kleine Ergänzung dazu:
Die Anzahl im Konstruktor anzugeben, bringt oft einen Nebeneffekt mit, den man nicht erwartet. Es werden dabei schon n Objekte erstellt und im Vector angelegt. Da du diese aber nachher sowieso überschreibst, ist das sinnlos.

Ein bzw. der Vorteil von Vectoren ist ja, dass man sich um die Größe (meist) nicht wirklich kümmern muss.
Das einzige, was manchmal sinnvoll sein kann ist ein vec.reserve(n). Damit wird Speicher für n Elemente angefordert und bei großen Datenmengen kann die kontinuierliche Anforderung von Speicher den ein oder anderen Algo merkbar verlangsamen.

Da du auch noch nach einer anderen Lösung fragst, hier mal die etwas mehr C++'sche:
Code:
#include <fstream>
#include <vector>
#include <algorithm>
#include <string>
#include <iterator>

const char* OPEN_FILENAME = "foo.txt";

int main()
{
	std::vector<std::string> lines;
	std::ifstream open_file(OPEN_FILENAME);
	
	if(open_file)
	{
		std::copy(std::istream_iterator<std::string>(open_file), std::istream_iterator<std::string>(), std::back_inserter(lines));
	}
}


Gruß
Gruß