Cum se adaugă un element la matricea C++? (Programare, C++, Array-Uri)

r4ccoon a intrebat.

Vreau să adaug un int într-un array, dar problema este că nu știu care este indicele acum.

int[] arr = new int[15];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;

Acel cod funcționează pentru că știu la ce index atribui, dar dacă nu știu indexul…

În PHP, pot să fac pur și simplu arr[]=22;care va adăuga automat 22 la următorul indice gol din matrice. Dar în C++ nu pot face asta, îmi dă o eroare de compilare. Ce îmi sugerați voi?

Comentarii

  • De fapt, „codurile alea” nici măcar nu compilează. „int[] arr” nu este modul în care se declară un array în C/C++ – este „int arr[]”. Dar codul tău are probleme mai grave, pe care celelalte răspunsuri le abordează. –  > Por j_random_hacker.
12 răspunsuri
jab

Nu există nici o modalitate de a face ceea ce spui în C++ cu array-uri simple. Soluția C++ pentru asta este prin utilizarea bibliotecii STL care vă oferă std::vector.

Puteți folosi un vector în acest mod:

#include <vector>

std::vector< int > arr;

arr.push_back(1);
arr.push_back(2);
arr.push_back(3);

Comentarii

  • Veți avea nevoie de „#include <vector>”! =D –  > Por Eduardo Lucio.
  • De remarcat – puteți obține matricea din vector astfel, dacă aveți nevoie să o treceți în continuare ca o matrice: stackoverflow.com/a/2923290/802397 –  > Por netpoetica.
mmx

Array-urile în C++ nu își pot schimba dimensiunea în timpul execuției. În acest scop, ar trebui să folosiți vector<int> în schimb.

vector<int> arr;
arr.push_back(1);
arr.push_back(2);

// arr.size() will be the number of elements in the vector at the moment.

După cum se menționează în comentarii, vector este definit în vector antet și std spațiul de nume. Pentru a-l utiliza, trebuie să:

#include <vector>

și, de asemenea, fie să folosiți std::vector în codul dvs. sau adăugați

using std::vector; 

sau

using namespace std;

după #include <vector> linie.

Comentarii

  • +1 -> Sunt de acord, vectorii sunt de departe cel mai simplu mod de a face acest lucru. Nu uitați că aveți nevoie de: #include <vector> –  > Por Jon Cage.
  • De asemenea, utilizați std::vector sau adăugați utilizarea std::vector înainte de instanțiere. –  > Por Bastien Léonard.
azoundria

Nu trebuie să folosiți vectori. Dacă vrei să rămâi la array-uri simple, poți face ceva de genul acesta:

int arr[] = new int[15];
unsigned int arr_length = 0;

Acum, dacă doriți să adăugați un element la capătul matricei, puteți face așa:

if (arr_length < 15) {
  arr[arr_length++] = <number>;
} else {
  // Handle a full array.
}

Nu este la fel de scurt și grațios ca echivalentul PHP, dar realizează ceea ce ați încercat să faceți. Pentru a vă permite să modificați cu ușurință dimensiunea tabloului în viitor, puteți utiliza un #define.

#define ARRAY_MAX 15

int arr[] = new int[ARRAY_MAX];
unsigned int arr_length = 0;

if (arr_length < ARRAY_MAX) {
  arr[arr_length++] = <number>;
} else {
  // Handle a full array.
}

Acest lucru face mult mai ușoară gestionarea matricei în viitor. Schimbând 15 în 100, dimensiunea tabloului va fi modificată în mod corespunzător în întregul program. Rețineți că va trebui să setați array-ul la dimensiunea maximă așteptată, deoarece nu o puteți modifica odată ce programul este compilat. De exemplu, dacă aveți un array de dimensiune 100, nu veți putea introduce niciodată 101 elemente.

Dacă veți utiliza elemente de la capătul array-ului, puteți face acest lucru:

if (arr_length > 0) {
  int value = arr[arr_length--];
} else {
  // Handle empty array.
}

Dacă doriți să puteți șterge elemente de la început, (adică un FIFO), soluția devine mai complicată. Aveți nevoie, de asemenea, de un index de început și de sfârșit.

#define ARRAY_MAX 15

int arr[] = new int[ARRAY_MAX];
unsigned int arr_length = 0;
unsigned int arr_start = 0;
unsigned int arr_end = 0;

// Insert number at end.
if (arr_length < ARRAY_MAX) {
  arr[arr_end] = <number>;
  arr_end = (arr_end + 1) % ARRAY_MAX;
  arr_length ++;
} else {
  // Handle a full array.
}

// Read number from beginning.
if (arr_length > 0) {
  int value = arr[arr_start];
  arr_start = (arr_start + 1) % ARRAY_MAX;
  arr_length --;
} else {
  // Handle an empty array.
}

// Read number from end.
if (arr_length > 0) {
  int value = arr[arr_end];
  arr_end = (arr_end + ARRAY_MAX - 1) % ARRAY_MAX;
  arr_length --;
} else {
  // Handle an empty array.
}

În acest caz, folosim operatorul modul (%) pentru a face ca indicii să fie înfășurați. De exemplu, (99 + 1) % 100 este 0 (un increment de înfășurare). Iar (99 + 99) % 100 este 98 (o descreștere de tip wrapping). Acest lucru vă permite să evitați declarațiile if și să faceți codul mai eficient.

De asemenea, puteți vedea rapid cât de util este #define pe măsură ce codul dumneavoastră devine mai complex. Din nefericire, chiar și cu această soluție, nu ați putea introduce niciodată peste 100 de elemente (sau orice maxim pe care l-ați stabilit) în matrice. De asemenea, folosiți 100 de octeți de memorie chiar dacă doar 1 singur element este stocat în array.

Acesta este principalul motiv pentru care alții au recomandat vectori. Un vector este gestionat în spatele scenei, iar noua memorie este alocată pe măsură ce structura se extinde. Tot nu este la fel de eficient ca o matrice în situațiile în care dimensiunea datelor este deja cunoscută, dar, în majoritatea cazurilor, diferențele de performanță nu vor fi importante. Există compromisuri pentru fiecare abordare și este mai bine să le cunoașteți pe amândouă.

Comentarii

  • Sunt cu siguranță un începător în C++, dar obțin un rezultat destul de consistent. Array initializer must be an initializer list atunci când încerc să folosesc int arr[] = new int[15]; de inițializare a matricei arr. –  > Por Yu Chen.
anon

Utilizați un vector:

#include <vector>

void foo() {
    std::vector <int> v;
    v.push_back( 1 );       // equivalent to v[0] = 1
}

Brian R. Bondy
int arr[] = new int[15];

Variabila arr conține o adresă de memorie. La adresa de memorie, există 15 intrări consecutive într-un rând. Acestea pot fi referite cu indicii de la 0 la 14 inclusiv.

În php pot face doar acest lucru arr[]=22; acest lucru va adăuga automat 22 la următorul index gol al array-ului.

Nu există conceptul de „next” (următor) atunci când este vorba de array-uri.
Un lucru important pe care cred că nu îl înțelegeți este că, imediat ce este creat un array, toate elementele array-ului există deja. Ele sunt neinițializate, dar toate există deja. Așadar, nu „umpleți” elementele tabloului pe măsură ce avansați, ci acestea sunt deja umplute, doar că sunt neinițializate. Nu există nicio modalitate de a testa dacă există un element neinițializat într-un array.

Se pare că doriți să folosiți o structură de date, cum ar fi un fișier coadă sau stivă sau vector.

dirkgently

Sunt pe deplin de acord cu vector modul în care se implementează o matrice dinamică. Cu toate acestea, țineți cont de faptul că STL vă pune la dispoziție o serie de containere care răspund diferitelor cerințe de execuție. ar trebui să alegeți unul cu grijă. De ex: Pentru o inserție rapidă la spate aveți de ales între un vector și a deque.

Și era să uit, cu o mare putere vine o mare responsabilitate 🙂 De la vectorau dimensiuni flexibile, deseori se realocă automat pentru a se adapta la adăugarea de elemente.Aveți grijă la invalidarea iteratorilor (da, se aplică și la pointeri). Cu toate acestea, atâta timp cât utilizați operator[] pentru accesarea elementelor individuale, sunteți în siguranță.

binarybob

S-ar putea să nu înțeleg rostul întrebării dvs. aici, iar dacă este așa îmi cer scuze. Dar, dacă nu veți șterge elemente, ci doar le veți adăuga, de ce să nu atribuiți pur și simplu o variabilă la următorul slot gol? De fiecare dată când adăugați o nouă valoare la matrice, doar incrementați valoarea pentru a indica următoarea.

În C++, o soluție mai bună este utilizarea tipului de bibliotecă standard std::list< type >, care permite, de asemenea, creșterea dinamică a tabloului, de exemplu:

#include <list>

std::list<int> arr; 

for (int i = 0; i < 10; i++) 
{
    // add new value from 0 to 9 to next slot
    arr.push_back(i); 
}

// add arbitrary value to the next free slot
arr.push_back(22);

shortwavedave

Inițializați mai întâi toate elementele tabloului la null, apoi căutați null pentru a găsi slotul gol

JavaCakes

Puteți utiliza o variabilă pentru a număra locurile din array, astfel încât, atunci când adăugați un nou element, îl puneți în locul potrivit. De exemplu:

int a = 0;
int arr[5] = { };
arr[a] = 6;
a++;

Dezvoltator trist

Dacă scrieți în C++ – este mult mai bine să folosiți structuri de date din biblioteca standard, cum ar fi vectorul.

Tablourile de tip C sunt foarte predispuse la erori și ar trebui evitate ori de câte ori este posibil.

Ninad Kulkarni
int array arraySize = 25;   
int array[arraySize];
array[0] = 3;
array[1] = 9;
array[2] = 27;

Dacă ați declarat arraySize ca fiind 25, atunci nu puteți adăuga mai multe valori decât 25.

Prince kushwaha

Deoarece am primit atât de multe feedback-uri negative, mi-am dat seama că soluția mea era greșită, așa că am schimbat-o.

int arr[20] = {1,2,3,4,5};
int index = 5;

void push(int n){
    arr[index] = n;
    index++;
}

push(6)

Noua matrice va conține valori de la 1 la 6 și puteți face o funcție de ștergere în acest fel.

Comentarii

  • Dar tocmai ați atribuit la memoria care nu este alocată; acesta este un comportament nedefinit. –  > Por Toby Speight.
  • @prince kushwaha Asta presupunând că alocați mai multă memorie decât aveți nevoie, în loc să folosiți realloc. –  > Por Sapphire_Brick.
  • Întrebarea pe care a pus-o a fost că modul în care să țină evidența indexului matricei după fiecare inserție nu are nimic de-a face cu dimensiunea matricei. –  > Por Prince kushwaha.