Metoda vectori

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Chevalier
Junior
Junior
Posts: 4
Joined: 04 Feb 2013, 19:54

Metoda vectori

Post by Chevalier » 04 Feb 2013, 19:58

Exista vreo metoda prin care pot memora intr-un vector un text?

De exemplu:
In v[0] sa fie memorat "I am alive.", in v[1] sa fie memorat "Find me.".

Multumesc anticipat. :mrgreen:



User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Metoda vectori

Post by zlatomir » 04 Feb 2013, 20:07

Presupunand ca prin vectori te referi la std::vector poti face cam asa:

Code: Select all

std::vector<std::string> v;
v.push_back("I am alive");
v.push_back("Find me");

Chevalier
Junior
Junior
Posts: 4
Joined: 04 Feb 2013, 19:54

Re: Metoda vectori

Post by Chevalier » 04 Feb 2013, 20:10

Code: Select all

int v[9];
for(i=0;i<n;i++)
{
cin>>v[i];
}
v.push_back("xxx"); // memoreaza intr-un vector v[0] textul acela?
Ex:
Daca chem cu un cout<<v[0]; o sa imi afiseze pe ecran xxx?

Cred ca avem notiune diferita de vectori, sau nu cunosc eu.. Tocmai am iesit din liceu.

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Metoda vectori

Post by zlatomir » 04 Feb 2013, 20:14

push_back adauga la sfarsitul vecturului elementul dat, poti citi mai multe despre vectori aici si string aici

Chevalier
Junior
Junior
Posts: 4
Joined: 04 Feb 2013, 19:54

Re: Metoda vectori

Post by Chevalier » 04 Feb 2013, 20:19

This is confusing.
La mine un program pentru citire de vectori arata asa:

Code: Select all

#include<iostream>
using namespace std;
int main()
{
int v[256];
cin>>n;
for(i=0;i<n;i++)
{
	cin>>v[i];
}
}
Nu este corect ce am fost invatat? Acestia nu sunt vectori?
Linkurile le-am accesat, si parca este un alt limbaj de programare :).

Eu vroiam sa fac in asa fel incat fiecare v sa imi memoreze o serie de cuvinte cu ajutorul unei structuri repetitive(de 10036 ori).

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Metoda vectori

Post by Marius Bancila » 05 Feb 2013, 00:12

v este un sir, nu un vector. Un sir este o secventa de cu lungime fixa, in timp ce un vector este o secventa cu lungime variabila.

In exemplul tau, v e un sir de intregi. Daca vrei sa memorezi cuvinte trebuie sa ai o secventa (sir, vector, etc.) de std::string.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Metoda vectori

Post by Ovidiu Cucu » 05 Feb 2013, 09:30

@Marius:
Profii (de liceu si nu numai) mai spun "vector" la array-uri/siruri/matrici uni-dimensionale.
Am spus intotdeauna ca intai trebuie invatat C si apoi C++. Acum vezi ce se intampla: termina omul liceul, crede ca stie C++ si cand colo n-a invatat decat "C cu cin si cout". Deh, le e mai usor profilor sa foloseasca cin si cout decat scanf si printf in care probabil ca isi prind urechile. Si-atunci, isi denumesc cursul de C, pompos, "programare in limbajul C++". :)

@Chevalier:
Marius si cu Zlatomir ti-au sugerat ca mai bine pentru scopul propus este sa folosesti clasele din biblioteca C++ standard (STL) std::vector si std::string.

Sigur, C++ este un limbaj "derivat" din limbajul C, deci poti sa folosesti in continuare array-urile "C-style". In cazul de fata, o solutie ar fi sa bagi acele texte intr-un array bi-dimensional de char-uri. Este relativ usor la prima vedere insa peste mana pentru ca, asa cum s-a mai spus, acestea nu pot avea decat dimensiuni fixe. In plus, trebuie sa ai grija ca sa nu dai pe dinafara (ex. liniile din array au dimensiunea N iar utilizatorul baga un text cu lungime N+1 sau mai mare, cu tot cu terminatorul de string). Tot folosind array-uri, ai putea optimiza bagand textele intr-un array uni-dimensional, separate cu NUL ('\0'). E o metoda destul de des folosita de programatorii C insa e si asta peste mana, atunci cand o sa vrei sa le scoti de acolo. Si-or mai fi pe acelasi calapod de C...

Un pic mai bine ar fi ca, in loc sa folosesti un array batut in cuie, sa adaugi/stergi elemente in mod dinamic (cu malloc/free sau cu new/delete).

Si mai bine (ca tot vorbim la rubrica "C++") treci de la programarea procedurala la cea orientata obiect si, bazat pe solutia precedenta, scrii propriile clase Vector si String. Destul de peste mana si asta, tinand cont ca ai inca probleme chiar si la lucrul cu array-uri. Si banui ca nu v-a spus proful ce-i aia o clasa.
Asa ca...

...in fine, odata ce programezi in C++ si nu in C, cel mai bine, mai sigur, mai usor si mai elegant este sa folosesti std::vector si std::string. Punct.

[ off-topic ]
Apropo, intreb doar din curiozitate si fara misto. V-a spus proful vreodata ce sunt acele "minuni" pe care le foloseste el cu atata sarg in fiecare programel, cin si cout? Sau ce sunt / cum se numesc acele "sagetute" de langa cin si cout (>> si <<)? :)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Metoda vectori

Post by Ovidiu Cucu » 05 Feb 2013, 12:27

Adaug o mica observatie la ce-am spus mai sus, ca sa nu-mi sara cumva in cap vreun C-guru. :)

Spre deosebire de standardul de C din 1989 (aka C89, aka ANSI C), cel din 1999 (aka C99, aka ISO C) prevede "variable length arrays" (array-uri cu lungime variabila).
De exemplu, conform C99 urmatorul cod este corect:

Code: Select all

#include <stdio.h>

void f(unsigned int N)
{
   float v[N]; /* variable length array */
   /* code here... */
}

int main()
{
   unsigned int n = 0;
   scanf("%u", &n);
   f(n);
   return 0;
}
Din pacate, nu toate compilatoarele suporta 100% noile prevederi ale lui C99, incluzand cea mentionata mai sus.
Asa ca, e de preferat sa se evite folosirea de array-uri cu lungime variabila. Personal, am intalnit probleme din cauza aceasta, cand a trebuit mutat un proiect dintr-un IDE in altul, folosind alt compilator.

Revenind la problema noastra, din nou: odata ce programam in C++ si nu in C (si odata ce folosim deja "marfa" din STL, cum ar fi std::cin), sunt in general de preferat clasele container din STL (std::vector, etc) in locul array-urilor C-style.

Vezi in MSDN Library: STL Containers

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Metoda vectori

Post by Ovidiu Cucu » 05 Feb 2013, 14:18

Acuma, ca sa nu spui ca-s baiat rau si ca te-am luat tare cu STL si standarde si alte "cioace" de care probabil profii n-au auzit sau au auzit dar nu vor sa spuna :), uite un exemplu de cat de usor se rezolva problema ta cu std::vector si std::string:

Code: Select all

#include <iostream>
#include <vector>
#include <string>
using namespace std;
void citeste(size_t N, vector<string>& v);
void afiseaza(const vector<string>& v);

int main()
{
   size_t N = 0; 
   cout << "introdu numarul de elemente: ";
   cin >> N;
   vector<string> v;
   citeste(N, v);
   afiseaza(v);
   return 0;
}
void citeste(size_t N, vector<string>& v)
{
   v.resize(N);
   for(size_t i = 0; i < N; i++)
   {
      cout << "introdu v[" << i << "]: ";
      cin >> v[i];
   }
}
void afiseaza(const vector<string>& v)
{
   const size_t N = v.size();
   for(size_t i = 0; i < N; i++)
   {
      cout << "v[" << i << "]= " << v[i] << endl;
   }
}
Sigur, fata de ce ai invatat, s-ar putea ca la inceput STL-ul sa-ti para un fel de afrikaans, swahili sau gibberish, insa cu un pic de bunavointa poti arunca un ochi in documentatie sa vezi ce mai poate si cum trebuie folosit.
// Mie si acum imi pare STL-ul gibberish :) insa asta e... il folosesc oridecate ori am nevoie. ;)

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Metoda vectori

Post by Ovidiu Cucu » 05 Feb 2013, 16:14

O ultima observatie, referitoare la puctul #3 dupa care iau o pauza. :)
Chevalier wrote: [...]

Code: Select all

int v[256];
cin>>n;
for(i=0;i<n;i++)
{
[...]
[...]
Eu vroiam sa fac in asa fel incat fiecare v sa imi memoreze o serie de cuvinte cu ajutorul unei structuri repetitive(de 10036 ori).


Daca am inteles bine ce vrei sa faci si daca n ar lua minunata valoare de 10036, mergand pe calea asta ar trebui sa declari o matrice de genul:

Code: Select all

   char v[256][10036];
Ceea ce inseamna ca se pune pe stiva 256 * 10036 = 2569216 octeti ceea ce reprezinta cam 2.5MB. (sper ca am socotit bine :)).
Fara sa mai intru in alte amanunte, punem pariu pe zece beri ca in mod normal programul va da un frumos "stack overflow" si va crapa cu strigaturi.
De regula, stiva nu este pentru pus pe ea date babane. In loc se foloseste memoria heap (in care se aloca cu operatorul new).

Are si heap-ul limitele lui (in computerele actuale nu exista "infinit"), insa in caz ca la un momentdat nu mai are spatiu unde sa aloce, STL-ul iti va arunca o exceptie pe care poti s-o prizi cam asa:

Code: Select all

   try
   {
      // cod care poate arunca exceptii
   }
   catch(exception& e)
   {
      cout << e.what(); // spune ce s-a intamplat.
      // ... alte masuri.
   }
Macar programul nu crapa, vezi ce se intampla si eventual poti lua oaresce masuri ca sa repari situatia.
Daca sunt nelamuriri si/sau vrei amanunte, te rog intreaba!

Chevalier
Junior
Junior
Posts: 4
Joined: 04 Feb 2013, 19:54

Re: Metoda vectori

Post by Chevalier » 05 Feb 2013, 21:12

Multumesc mult!
Dar destul! Ma bagati in nori adanci, poate deja am ajuns pe luna..

O sa ma apuc sa invat toate lucrurile astea noi si poate o sa iau si un curs mai avansat de C++.

Din nou, va multumesc!

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Metoda vectori

Post by black_atus » 06 Feb 2013, 10:08

std::vector e un container din STL. Sigur nu ai invatat STL in liceu.

Poti face ceva de genul:

Code: Select all

#include "stdafx.h"

#include<stdio.h>
#include<conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	char* vect[3];
	
	vect[0] = "test 111\n";
	vect[1] = "test 222\n";
	vect[2] = "test 333\n";

	for(int i = 0; i < 3; i++)
		printf("%s",vect[i]);

	getch();

	return 0;
}
Cu stima,
Daniel Constantin

User avatar
black_atus
Membru
Membru
Posts: 139
Joined: 20 Jun 2012, 10:20
Judet: Prahova
Location: Ploiesti

Re: Metoda vectori

Post by black_atus » 06 Feb 2013, 10:17

Insa daca ai asa multe date mai bine folosesti alocarea dinamica("new" daca vrei in C++ sau "malloc" daca vrei in C) asa cum zicea Ovidiu.
Cu stima,
Daniel Constantin

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Metoda vectori

Post by Ovidiu Cucu » 06 Feb 2013, 21:06

Chevalier wrote: Dar destul! Ma bagati in nori adanci, poate deja am ajuns pe luna..
Daca o sa ajungi programator, o sa spui asta doar in doua situatii:
1. te-ai saturat de slujba si iti dai demisia, sau...
2. ...nu mai poti suporta si te lasi de programare. :D ;)

User avatar
Knuth
Junior
Junior
Posts: 15
Joined: 02 Feb 2012, 12:17
Judet: Hunedoara
Contact:

Re: Metoda vectori

Post by Knuth » 07 Feb 2013, 11:29

Marius Bancila wrote:v este un sir, nu un vector. Un sir este o secventa de cu lungime fixa, in timp ce un vector este o secventa cu lungime variabila.
Care este sursa acestei definitii a vectorului?

Post Reply