Wzkaźniki vector

0

Mam problem mianowicie pogubiłem się trochę na wzkaźnikach czy mógłby mi ktoś pomóc ?

public ref class MyForm : public System::Windows::Forms::Form
	{
	public:

		vector<string> *v  ;

 

a poźniej nie mogę dostać się do wartości poszczególnych elementów...

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 int i = 0 ; 
				
				for (i = 0; i<v->size();i++)
				 MessageBox::Show(gcnew String(v->at[i].c_str()));

			 }

public: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
				int numerWiersza = 0;
				string wiersz;
				ifstream f("przystanki.txt");
				if (f.is_open())
				{
					while (getline (f, wiersz,'\t'))
					{
					
						v->push_back(wiersz); 
						
					}



				}
				f.close();
}
 
0
MessageBox::Show(gcnew String(v->at[i].c_str())); 

o to chodzi? Nie powinno być MessageBox::Show(gcnew String(v->at(i).c_str()));

?
0

teraz mam problem już podczas kompilacji

public ref class MyForm : public System::Windows::Forms::Form
    {
    public:
 
        vector<string> *v  ; 
int numerWiersza = 0;
				
				string wiersz;
				ifstream f("przystanki.txt");
				if (f.is_open())
				{
					while (getline (f, wiersz,'\t'))
					{
						
						v->push_back(wiersz); 
						
					}



				}
				f.close();
} 

Załączam zdjęcie

0

A stwarzasz ten wektor? W konstrutorze czy coś. Wgl czemu komplikujesz sobie przez wskaźnik? Czemu wskaźnik, a nie zwykły obiekt? Wstaw też cały kod jak możesz

0

Deklarujesz wskaźnik na wektor ale nigdzie nie tworzysz obiektu takiego wektora i za razem nie przypisujesz adresu tego obiektu do tego wskaźnika.

0
 #pragma once
#include <string>
#include <fstream>
#include "Str.h"
#include <vector>
#include <iostream>
#include <conio.h>
#include "Nawigacja.h"


namespace Project2 {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	using namespace std;

	/// <summary>
	/// Summary for MyForm
	/// </summary>
	public ref class MyForm : public System::Windows::Forms::Form
	{
	public:
		

		vector<string> *v  ;
		MyForm(void)
		{
			InitializeComponent();
			
			//
			//TODO: Add the constructor code here
			//
			
		}
		
	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~MyForm()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Button^  button1;
	public: System::Windows::Forms::Label^  label1;
	private: System::Windows::Forms::TextBox^  textBox1;
	public: 
	protected: 

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->label1 = (gcnew System::Windows::Forms::Label());
			this->textBox1 = (gcnew System::Windows::Forms::TextBox());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(101, 159);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &MyForm::button1_Click);
			// 
			// label1
			// 
			this->label1->AutoSize = true;
			this->label1->Location = System::Drawing::Point(98, 101);
			this->label1->Name = L"label1";
			this->label1->Size = System::Drawing::Size(35, 13);
			this->label1->TabIndex = 1;
			this->label1->Text = L"label1";
			// 
			// textBox1
			// 
			this->textBox1->Location = System::Drawing::Point(75, 35);
			this->textBox1->Name = L"textBox1";
			this->textBox1->Size = System::Drawing::Size(100, 20);
			this->textBox1->TabIndex = 2;
			// 
			// MyForm
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(284, 261);
			this->Controls->Add(this->textBox1);
			this->Controls->Add(this->label1);
			this->Controls->Add(this->button1);
			this->Name = L"MyForm";
			this->Text = L"MyForm";
			this->Load += gcnew System::EventHandler(this, &MyForm::MyForm_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion

	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 int i = 0 ; 
				
				
				// for (i = 0; i<nawigacja.Wektor->size();i++)
					// MessageBox::Show(gcnew String(v->at(i).c_str()));

				 
			 }

	public: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
				int numerWiersza = 0;
				//vector<string> v ;
				string wiersz;
				ifstream f("przystanki.txt");
				if (f.is_open())
				{
					while (getline (f, wiersz,'\t'))
					{
						
						v->push_back(wiersz); 
						
					}



				}
				f.close();
				
				

			
			}
	};
}

chce mieć dostęp do vector w dwóch funkcjach więc dlatego to zdeklarowałem głobalnie. A globalnie obiektu nie mogę utworzyć tylko jako wzkaźnik inaczej błąd mi wyskakuje.
Ogólnie idea jest taka by w Load ładował stringi do vectora a po przyciśnięciu przycisku wypisywał je w MessageBox

0

Nie tworzysz nigdzie tego wektora. Dodaj

 v= new vector<string>; 

w konstruktorze MyForm
No i w destruktorze zwalniaj go przez delete

0

Jak piszesz pod .NETa to trzymaj się klas dotnetowych a nie STL-a, a więc List a nie vector.
Mieszając klasy natywne z zarządzanymi tylko sobie problemy stwarzasz, z którymi potem musisz bohatersko walczyć.

0

z tego co wyczytałem vector przy wyszukiwaniu elementów jest szybszy od List, a program ogólnie będzie głownie wyszukiwał, dlatego zdecydowałem się na klasę vector

0

z tego co wyczytałem vector przy wyszukiwaniu elementów jest szybszy od List

Bzdura.
System.Collections.Generic.List<> uzywa pod spodem tablicy do przechowywania elementow. Zasada dzialania tej klasy jest analogiczna do klasy std::vector<>. Zlozonosc obliczenia dostepu do konkretnego elementu po indeksie w obu przypadkach wynosi O(1). Wyszukiwanie natomiast po wartosci w obu przypadkach ma zlozonosc O(N). Zrodla:
http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
N3337: 23.3.6.4

0

więc jaka jest różnica ?

1

Taka, że jak napisał Azarien jak piszesz w .NET to lepiej używać rozwiązań z .NET czyli List<>

0

Tu nie chodzi o to co jest szybsze.
.NETowa klasa List współpracuje z garbage collectorem. To znaczy, że nie przejmujesz się niszczeniem obiektu.
Klasa vector z STL normalnie powinna być używana przez wartość, czyli vector<int>, a nie vector<int>*. Ale nie możesz tego zrobić, bo MyForm jest klasą zarządzaną, a polem takiej klasy nie może być obiekt natywny - może być co najwyżej wskaźnik. To cię zmusza do robienia brzydkiego new i delete na vectorze.

Po prostu nie miesza się różnych bibliotek ze sobą. Używasz .NET, to unikaj STL.

1 użytkowników online, w tym zalogowanych: 0, gości: 1