C ++

Hvordan bruke C ++ Vector

Hvordan bruke C ++ Vector

Introduksjon

En matrise er en serie av samme objekttyper i påfølgende minneplasseringer. En matrise kan ikke øke malmens lengde. En vektor er som en matrise, men lengden kan økes eller reduseres. En vektor har derfor mange flere operasjoner enn en matrise.

C ++ har mange biblioteker, som alle danner C ++ Standard Library. En av disse bibliotekene er containerbiblioteket. En container er en samling objekter, og visse operasjoner kan utføres på samlingen. C ++ - containere kan grupperes i to sett: sekvensbeholdere og assosierende containere. Sekvensbeholdere er vektor, matrise (ikke den samme matrisen diskutert tidligere), deque, fremoverliste og liste. Dette er forskjellige samlinger (array-lignende datastrukturer), og hver tilbyr forskjellige avveininger.

Enhver programmerer bør vite hvordan de skal bestemme om de skal bruke en vektor, en matrise, en deque, en forward_list eller en liste. Når en programmerer trenger en struktur som krever flere operasjoner enn de som er knyttet til en vanlig matrise, bør den vanlige matrisen ikke brukes.

Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremoverliste brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger i begynnelsen eller slutten av en sekvens, bør en deque brukes. En vektor bør brukes når denne typen operasjoner ikke er påkrevd.

Denne artikkelen viser deg hvordan du bruker C ++ -vektoren. Du trenger litt kunnskap om C ++ pekere, referanser og matriser for å forstå denne artikkelen.

Klasse og gjenstander

En klasse er et sett med variabler og funksjoner som fungerer sammen, der variablene ikke har verdier tildelt. Når verdier tildeles variablene, blir en klasse et objekt. Ulike verdier gitt til samme klasse resulterer i forskjellige objekter; det vil si at forskjellige objekter kan være av samme klasse, men ha forskjellige verdier. Å lage et objekt fra en klasse er også kjent som å instantere objektet.

Begrepet vektor beskriver en klasse. Et objekt opprettet fra en vektor har et navn som velges av programmereren.

En funksjon som tilhører en klasse er nødvendig for å instantiere et objekt fra klassen. I C ++ har den funksjonen samme navn som navnet på klassen. Ulike objekter opprettet (instantiert) fra klassen har forskjellige navn gitt til hver av dem av programmereren.

Å lage et objekt fra en klasse betyr å konstruere objektet; det betyr også å instantiere objektet.

Vektorklassen

Vektorklassen er allerede definert og er i biblioteket. For å bruke vektorklassen, må en programmerer inkludere vektoroverskriften i filen med følgende forhåndsbehandlingsdirektiv:

#inkludere

Når toppteksten er inkludert, blir alle vektorfunksjonene (datamedlemmer og medlemsfunksjoner) tilgjengelige. For å bruke telleobjektet til å sende ut data til terminalen (konsoll), må også objektoverskriften være inkludert. For å skrive et program med vektoren, må minst følgende overskrifter være inkludert:

#inkludere
#inkludere

Instantiering av en vektor

int foo [10];

Ovenfor er erklæringen til en matrise med navnet "foo" og antall elementer "10.”Dette er en rekke heltall. Deklarasjonen av en vektor er lik. For en vektor er antall elementer valgfritt, siden vektorlengden kan øke eller redusere.

På dette punktet i programmet er vektorklassen allerede definert i biblioteket, og overskriften er inkludert. Vektoren kan instantiseres som følger:

std :: vektor vtr (8);

Her er vektoren til den spesielle konstruktorfunksjonen. Typen data vektoren vil inneholde er "int", i vinkelparenteser. Uttrykket “vtr” er navnet valgt av programmereren for vektoren. Til slutt er "8", i parentes, det foreløpige antall heltall vektoren vil ha.

Begrepet "std" står for standard navneområde. Dette begrepet må følges av et dobbelt kolon, i denne sammenheng. Hvem som helst kan skrive sitt eget vektorklassebibliotek og bruke det. Imidlertid har C ++ allerede et standardbibliotek med standardnavn, inkludert "vektor.”For å bruke et standardnavn, må standardnavnet være std :: . For å unngå å skrive std :: hver gang i programmet for et standardnavn, kan programfilen starte som følger:

#inkludere
#inkludere
bruker navneområde std;

Overbelastning av en funksjon

Når to eller flere forskjellige funksjonssignaturer har samme navn, sies det at navnet er overbelastet. Når en funksjon kalles, bestemmer antall og type argumenter hvilken funksjon som utføres.

Konstruere en vektor

Å konstruere en vektor betyr å starte (lage) et vektorobjekt. Konstruktorfunksjonen er overbelastet som følger:

vektor Navn

Dette skaper en vektor med lengde null og skriver “T."Følgende utsagn oppretter en vektor med null lengde av typen" flyte "med navnet" vtr: "

vektor vtr;

vektor navn (n)

Dette skaper en vektor med n elementer av typen “T.”En uttalelse for denne vektoren med fire flyteelementer er som følger:

vektor vtr (4);

vektor navn (n, t)

Dette skaper en vektor av n elementer initialisert til verdien t. Følgende utsagn oppretter en vektor på 5 elementer, hvor hvert element har verdien 3.4:

vektor vtr (5, 3.4);

Konstruksjon med initialisering

En vektor kan konstrueres (opprettes) og initialiseres samtidig, på en av følgende to måter:

vektor vtr = 1.1, 2.2, 3.3, 4.4;

Eller

vektor vtr 1.1, 2.2, 3.3, 4.4;

Merk at det ikke er noen parentes like etter objektnavnet. Parenteser som brukes like etter objektnavnet, bør ha initialiseringslisten, som følger:

vektor vtr (1.1, 2.2, 3.3, 4.4);

En vektor kan konstrueres og initialiseres senere med initialiseringslisten. I dette tilfellet vil ikke parentesene brukes:

vektor vtr;
vtr = 1.1, 2.2, 3.3, 4.4;

vektor V2 (V1)

Dette er en kopikonstruktør. Den lager en vektor V2 som en kopi av vektoren V1. Følgende kode illustrerer dette:

vektor vtr1 (5, 3.4);
vektor vtr2 (vtr1);

Tilordne en vektor under konstruksjon

Under konstruksjon kan en tom vektor opprettes mens en annen tilordnes den, som følger:

vektor vtr1 1.1, 2.2, 3.3, 4.4;
vektor vtr2 = vtr1;

Den andre utsagnet tilsvarer:

vektor vtr2 = 1.1, 2.2, 3.3, 4.4;

const Vector

En const-vektor er en vektor hvis elementer ikke kan endres. Verdiene i denne vektoren er skrivebeskyttet. Når den er opprettet, vises vektoren som følger:

const vektor vtr 1.1, 2.2, 3.3, 4.4;

I denne vektortypen kan ikke noe element legges til eller fjernes. Videre kan ingen verdi endres.

Konstruksjon med Iterator

En mal gir en generell representasjon for en datatype. En iterator gir en generell representasjon av skanning gjennom verdiene til en container. Syntaksen for å lage en vektor med en iterator er som følger:

mal
vektor (InputIterator først, InputIterator sist, const Allocator & = Allocator ());

Dette konstruerer en vektor for området [første, siste] ved hjelp av den spesifiserte tildeleren, som vil bli diskutert senere i denne artikkelen.

Å ødelegge en vektor

For å ødelegge en vektor, bare la den gå utenfor omfanget og ødelegge håndteres automatisk.

Vektorkapasitet

størrelse_type kapasitet () const noexcept

Det totale antall elementer vektoren kan inneholde uten å kreve omdisponering returneres av kapasitetsmedlemfunksjonen. Et kodesegment for dette er som følger:

vektor vtr (4);
int num = vtr.kapasitet();
cout << num << '\n';

Utgangen er 4.

reserve (n)

Minneplass er ikke alltid fritt tilgjengelig. Ekstra plass kan reserveres på forhånd. Vurder følgende kodesegment:

vektor vtr (4);
vtr.reserve (6);
cout << vtr.capacity() << '\n';

Utgangen er 6. Så den ekstra reserverte plassen er 6 - 4 = 2 elementer. Funksjonen returnerer ugyldig.

størrelse () const noexcept

Dette returnerer antall elementer i vektoren. Følgende kode illustrerer denne funksjonen:

vektor vtr (4);
flyte sz = vtr.størrelse();
cout << sz << '\n';

Utgangen er 4.

krymp for å passe()

Etter å ha gitt ekstra kapasitet til en vektor med reserve () -funksjonen, kan vektoren deles ned for å passe til den opprinnelige størrelsen. Følgende kode illustrerer dette:

vektor vtr (4);
vtr.reserve (6);
vtr.krymp for å passe();
int sz = vtr.størrelse();
cout << sz << '\n';

Utgangen er 4 og ikke 6. Funksjonen returnerer ugyldig.

endre størrelse (sz), endre størrelse (sz, c)

Dette endrer størrelsen på vektoren. Hvis den nye størrelsen er mindre enn den gamle størrelsen, blir elementene mot slutten slettet. Hvis den nye størrelsen er lengre, blir noen standardverdier lagt til mot slutten. For å ha en bestemt merverdi, bruk resize () -funksjonen med to argumenter. Følgende kodesegment illustrerer bruken av disse to funksjonene:

vektor vtr1 1.1, 2.2, 3.3, 4.4;
vtr1.endre størrelse (2);
cout << "New size of vtr1: " << vtr1.size() << '\n';
vektor vtr2 1.1, 2.2;
vtr2.endre størrelse (4, 8.8);
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';

Resultatet er følgende:

Ny størrelse på vtr1: 2
vtr2: 1.1 2.2 8.8 8.8

Funksjonene blir ugyldige.

tom () const noexcept

Denne funksjonen returnerer 1 for true hvis det ikke er noen elementer i vektoren og 0 for false hvis vektoren er tom. Hvis en vektor har fire steder for en bestemt type data, for eksempel float, uten floatverdi, er ikke vektoren tom. Følgende kode illustrerer dette:

vektor vtr;
cout << vtr.empty() << '\n';
vektor vt (4);
cout << vt.empty() << '\n';
vektor v (4,3.5);
cout << v.empty() << '\n';

Resultatet er følgende:

1
0
0

Vector Element Access

En vektor kan være undertegnet (indeksert) som en matrise. Indeksetelling begynner fra null.

vectorName [i]

Operasjonen "vectorName [i]" returnerer en referanse til elementet ved ith indeks av vektoren. Følgende kodeutganger 3.3 for ovennevnte vektor:

vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr [2];
cout << fl << '\n';

vectorName [i] konst

Operasjonen "vectorName [i] const" utføres i stedet for "vectorName [i]" når vektoren er en konstant vektor. Denne operasjonen brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr [2];
cout << fl << '\n';

Uttrykket returnerer en konstant referanse til ith element av vektoren.

Tilordne en verdi med abonnement

En verdi kan tildeles en ikke-konstant vektor, som følger:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vtr [2] = 8.8;
cout << vtr[2] << '\n';

Utgangen er 8.8.

vectorName.ved (i)

“VectorName.at (i) ”er som“ vectorName [i], ”men“ vectorName.at (i) ”er mer pålitelig. Følgende kode viser hvordan denne vektoren skal brukes:

vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.ved (2);
cout << fl << '\n';
at () er en vektormedlemfunksjon.

vectorName.ved (i) konst

“VectorName.at (i) const ”er som“ vectorName [i] const ”, men“ vectorName.at (i) const ”er mer pålitelig. “VectorName.at (i) const "utføres i stedet for" vectorName.at (i) ”når vektoren er en konstant vektor. Denne vektoren brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.ved (2);
cout << fl << '\n';
at () const er en vektormedlemfunksjon.

Tilordne en verdi med at () -funksjonen

En verdi kan tildeles en ikke-konstant vektor med at () -funksjonen, som følger:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vtr.ved (2) = 8.8;
cout << vtr[2] << '\n';

Utgangen er 8.8.

Problem med sub-scripting

Problemet med sub-scripting (indeksering) er at hvis indeksen er utenfor området, kan null returneres eller en feil kan utstedes ved kjøretid.

front()

Dette returnerer en referanse til det første elementet i vektoren uten å fjerne elementet. Resultatet av følgende kode er 1.1.

vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.front();
cout << fl << '\n';

Elementet fjernes ikke fra vektoren.

front () konst

Når vektorkonstruksjonen går foran const, blir uttrykket "front () const" utført i stedet for "front ().”Dette brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.front();
cout << fl << '\n';

En konstant referanse returneres. Elementet fjernes ikke fra vektoren.

tilbake()

Dette returnerer en referanse til det siste elementet i vektoren uten å fjerne elementet. Resultatet av følgende kode er 4.4.

vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.tilbake();
cout << fl << '\n';

tilbake () konst

Når vektorkonstruksjonen går foran const, blir uttrykket "back () const" utført i stedet for "back ().”Dette brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
flyte fl = vtr.tilbake();
cout << fl << '\n';

En konstant referanse returneres. Elementet fjernes ikke fra vektoren.

Vector Data Access

data () noexcept; data () const noexcept;

En av disse returnerer en peker slik at [data (), data () + størrelse ()) er et gyldig område.

Dette vil bli dekket mer detaljert senere i artikkelen.

Returterende Iteratorer og Vector

En iterator er som en peker, men har mer funksjonalitet enn en peker.

begynn () noexcept

Returnerer en iterator som peker på det første elementet i vektoren, som i følgende kodesegment:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: iterator iter = vtr.begynne();
cout << *iter << '\n';

Utgangen er 1.1. Merk at erklæringen som mottar iteratoren er erklært. Iteratoren blir referert i et returuttrykk for å oppnå verdien på samme måte som en peker blir referert til.

begin () const noexcept;

Returnerer en iterator som peker på det første elementet i vektoren. Når vektorkonstruksjonen går foran const, utføres uttrykket "start () const" i stedet for "start ().”Under denne tilstanden kan ikke det tilsvarende elementet i vektoren endres. Dette brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: const_iterator iter = vtr.begynne();
cout << *iter << '\n';

Utgangen er 1.1. Merk at “const_iterator” har blitt brukt denne gangen i stedet for bare “iterator” for å motta den returnerte iteratoren.

slutt () noexcept

Returnerer en iterator som peker rett utover det siste elementet i vektoren. Vurder følgende kodesegment:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: iterator iter = vtr.slutt();
cout << *iter << '\n';

Utgangen er 0, som er meningsløs, da det ikke er noe konkret element utover det siste elementet.

end () const noexcept

Returnerer en iterator som peker rett utover det siste elementet i vektoren. Når vektorkonstruksjonen er innledet av "const", blir uttrykket "end () const" utført i stedet for "end ().Tenk på følgende kodesegment:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: const_iterator iter = vtr.slutt();
cout << *iter << '\n';

Utgangen er 0. Merk at “const_iterator” har blitt brukt denne gangen i stedet for bare “iterator” for å motta den returnerte iteratoren.

Omvendt iterasjon

Det er mulig å ha en iterator som itererer fra slutten til rett før det første elementet.

rbegin () noexcept

Returnerer en iterator som peker på det siste elementet i vektoren, som i følgende kodesegment:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: revers_iterator rIter = vtr.begynner ();
cout << *rIter << '\n';

Utgangen er 4.4.

Merk at erklæringen som mottar omvendt iterator er erklært. Iteratoren blir referert i et returuttrykk for å oppnå verdien på samme måte som en peker blir referert til.

rbegin () const noexcept;

Returnerer en iterator som peker på det siste elementet i vektoren. Når vektorkonstruksjonen er innledet av "const", blir uttrykket "rbegin () const" utført i stedet for "rbegin ().”Under denne betingelsen kan ikke det tilsvarende elementet i vektoren endres. Denne funksjonen brukes i følgende kode:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: const_reverse_iterator rIter = vtr.begynner ();
cout << *rIter << '\n';

Utgangen er 4.4.

Merk at const_reverse_iterator har blitt brukt denne gangen, i stedet for bare reverse_iterator, for å motta den returnerte iteratoren.

rend () noexcept

Returnerer en iterator som peker rett før det første elementet i vektoren. Vurder følgende kodesegment:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: revers_iterator rIter = vtr.rend ();
cout << *rIter << '\n';

Utgangen er 0, som er meningsløs, da det ikke er noe konkret element rett før det første elementet.

rend () const noexcept

Returnerer en iterator som peker rett før det første elementet i vektoren. Når vektorkonstruksjonen er foran "const", blir uttrykket "rend () const" utført i stedet for "rend ().Tenk på følgende kodesegment:

const vektor vtr 1.1, 2.2, 3.3, 4.4;
vektor:: const_reverse_iterator rIter = vtr.rend ();
cout << *rIter << '\n';

Utgangen er 0.

Merk at const_reverse_iterator har blitt brukt denne gangen, i stedet for bare reverse_iterator, for å motta den returnerte iteratoren.

Vector Modifiers

En modifikator som endrer vektoren kan ta eller returnere en iterator.

en.emplace (p, args)

Setter inn et objekt av typen T konstruert med std :: fremover(args) ... før s.

For detaljer - se senere

sett inn (iteratorPosisjon, verdi)

Setter inn en kopi av verdien i iteratorposisjonen til vektoren. Returnerer iteratoren (posisjon) i vektoren der kopien er plassert. Følgende kode viser hvor verdien er plassert:

vektor vtr 10, 20, 30, 40;
vektor:: iterator iter = vtr.begynne();
++iter;
++iter;
vtr.sett inn (iter, 25);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3] << '\n';

Utgangen er: 20 25 30.

Merk at iteratoren var avansert (inkrementert) akkurat som en peker.

En initialiseringsliste kan også settes inn, som følgende kode illustrerer:

vektor vtr 10, 20, 30, 40;
vektor:: iterator iter = vtr.begynne();
++iter;
++iter;
vtr.sett inn (iter, 25, 28);
cout << vtr[1] << " << vtr[2]<< '
' << vtr[3]<< " << vtr[4] << '\n';

Utgangen er: 20 25 28 30.

slett (posisjon)

Fjerner et element i posisjonen som iteratoren peker på, og returnerer deretter iteratorposisjonen. Følgende kode illustrerer dette:

vektor vtr 10, 20, 30, 40;
vektor:: iterator iter = vtr.begynne();
++iter;
++iter;
vtr.slette (iter);
cout << vtr[0] << " << vtr[1] << '
' << vtr[2]<< '\n';

Utgangen er: 10 20 40

push_back (t), push_back (rv)

Brukes til å legge til et enkelt element på slutten av vektoren. Bruk push_back (t) som følger:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vtr.push_back (5.5);
flyte fl = vtr [4];
cout << fl << '\n';

Utgangen er 5.5.

push_back (rv): - se senere.

pop_back ()

Fjerner det siste elementet uten å returnere det. Størrelsen på vektoren reduseres med 1. Følgende kode illustrerer dette:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vtr.pop_back ();
flyte sz = vtr.størrelse();
cout << sz << '\n';

Utgangen er 3.

en.bytte (b)

To vektorer kan byttes ut, som illustrert i følgende kodesegment:

vektor vtr1 1.1, 2.2, 3.3, 4.4;
vektor vtr2 10, 20;
vtr1.bytte (vtr2);
cout << "vtr1: "<< vtr1[0] <<" "<< vtr1[1] <<"
"<< vtr1[2] <<" "<< vtr1[3] << '\n';
cout << "vtr2: "<< vtr2[0] <<" "<< vtr2[1] <<"
"<< vtr2[2] <<" "<< vtr2[3] << '\n';

Utgangen er:

vtr1: 10 20 0 0
vtr2: 1.1 2.2 3.3 4.4

Merk at lengden på en vektor økes, om nødvendig. Verdier som ikke har erstatninger, blir også erstattet av noen standardverdier.

klar()

Fjerner alle elementer fra vektoren, som følgende kodesegment illustrerer:

vektor vtr 1.1, 2.2, 3.3, 4.4;
vtr.klar();
cout << vtr.size() << '\n';

Utgangen er 0.

Likestillings- og relasjonsoperatører for vektorer

Operatøren ==

Returnerer 1 for true hvis de to vektorene har samme størrelse og de tilsvarende elementene er like; Ellers returnerer den 0 for usann. For eksempel:

vektor U 1, 2, 3;
vektor V 4, 5, 6;
bool bl = U == V;
cout << bl << '\n';

Utgangen er 0.

De != Operatør

Returnerer 1 for true hvis de to vektorene ikke har samme størrelse og / eller de tilsvarende elementene ikke er like; Ellers returnerer den 0 for usann. For eksempel:

vektor U 1, 2, 3;
vektor V 4, 5, 6;
bool bl = U!= V;
cout << bl << '\n';

Utgangen er 1.

De < Operator

Returnerer 1 for sann hvis den første vektoren er den første delmengden av den andre vektoren, med elementene i de to like delene er de samme og i samme rekkefølge. Hvis begge vektorene er av samme størrelse og beveger seg fra venstre til høyre, og et element oppstår i den første vektoren som er mindre enn det tilsvarende elementet i den andre vektoren, vil 1 fortsatt bli returnert. Ellers returneres 0 for false. For eksempel:

vektor U 3, 1, 1;
vektor V 3, 2, 1;
bool bl = Ucout << bl << '\n';

Utgangen er 1. < does not include the case when the size and order are the same.

> Operatøren

Returnerer !(U < V), where U is the first vector and V is the second vector, according to the above definitions.

De <= Operator

Returnerer U <= V, where U is the first vector and V is the second vector, according to the above definitions.

Operatøren

Returnerer !(U <= V), where U is the first vector and V is the second vector, according to the above definitions.

Konklusjon

En vektor er et eksempel på en sekvensbeholder. En vektor er en “bedre” form for det ordinære oppsettet og instantieres fra en klasse. Vektorer har metoder som er klassifisert under: konstruksjon og tildeling, kapasitet, elementtilgang, datatilgang, iteratorer, modifikatorer og numeriske overbelastede operatører.

Det er andre sekvensbeholdere, kalt liste, fremoverliste og matrise. Hvis oppgaven innebærer hyppige innsettinger og slettinger midt i sekvensen, bør en liste eller fremoverliste brukes. Hvis oppgaven innebærer hyppige innsettinger og slettinger i begynnelsen eller slutten av sekvensen, bør en deque brukes. Og så bør vektorer bare brukes når denne typen operasjoner ikke er viktig.

Kamp for Wesnoth 1.1. 3.6 Utvikling utgitt
Kamp for Wesnoth 1.1. 3.6 utgitt i forrige måned, er den sjette utgivelsen i 1.1. 3.x-serien, og den leverer en rekke forbedringer, spesielt til bruke...
Slik installerer du League Of Legends på Ubuntu 14.04
Hvis du er fan av League of Legends, er dette en mulighet for deg å prøvekjør League of Legends. Merk at LOL støttes på PlayOnLinux hvis du er en linu...
Installer det siste OpenRA-strategispillet på Ubuntu Linux
OpenRA er en Libre / Free Real Time Strategy-spillmotor som gjenskaper de tidlige Westwood-spillene som den klassiske Command & Conquer: Red Alert. Di...