Pole (C++)
Pole je kolekce podobných objektů.Nejjednodušší případ pole je vektor, který může být deklarován následující sekvencí:
decl-specifier identifier [ constant-expression ]
decl-specifier identifier []
decl-specifier identifer [][ constant-expression] . . .
decl-specifier identifier [ constant-expression ]
[ constant-expression ] . . .
1.Specifikátor deklarace:
Volitelný specifikátor paměťové třídy.
Volitelné specifikátory const nebo volatile.
Název typu prvků pole.
2.Deklarátor:
Identifikátor.
Konstantní výraz integrálního typu uzavřený v hranatých závorkách, []. Pokud více dimenzí je deklarováno pomocí dalších závorek, v první sadě závorek může být vynechán konstantní výraz.
Volitelně přidejte hranaté závorky ohraničující konstantní výrazy.
3.Volitelný inicializátor. Viz Inicializátory.
Počet elementů v poli je definován konstantním výrazem.První prvek v poli je 0. prvkem a poslední prvek je prvek (n-1), kde n představuje počet prvků, který pole může obsahovat.Konstantní výraz musí být integrálního typu a musí být větší než 0.Pole o velikosti nula je povoleno pouze v případě, že je posledním polem objektu struct nebo unie a jsou povolena rozšíření společnosti Microsoft (/Ze).
Následující příklad ukazuje, jak definovat pole za běhu:
// arrays.cpp
// compile with: /EHsc
#include <iostream>
int main() {
using namespace std;
int size = 3, i = 0;
int* myarr = new int[size];
for (i = 0 ; i < size ; i++)
myarr[i] = 10;
for (i = 0 ; i < size ; i++)
printf_s("myarr[%d] = %d\n", i, myarr[i]);
delete [] myarr;
}
Pole jsou odvozené typy a lze je tedy sestavit z jakéhokoli jiného odvozeného nebo základního typu kromě funkcí, odkazů a hodnot void.
Pole, která jsou vyrobena z jiných polí, jsou vícerozměrná pole.Tato vícedimenzová pole jsou určena umístěním více složených závorek do konstantních výrazů v posloupnosti.Zvažte například tuto deklaraci:
int i2[5][7];
Určuje pole typu int koncepčně uspořádané v dvojrozměrné matici po pěti řádcích a sedmi sloupcích, jak je znázorněno na následujícím obrázku:
Rámcové rozložení vícerozměrného pole
V deklaracích vícerozměrných polí, která mají seznam inicializátorů (jak je popsáno v části Inicializátory), konstantní výraz, který určuje hranice pro první dimenzi, lze vynechat.Příklad:
// arrays2.cpp
// compile with: /c
const int cMarkets = 4;
// Declare a float that represents the transportation costs.
double TransportCosts[][cMarkets] = {
{ 32.19, 47.29, 31.99, 19.11 },
{ 11.29, 22.49, 33.47, 17.29 },
{ 41.97, 22.09, 9.76, 22.55 }
};
Předchozí prohlášení definuje pole, které má tři řádky a čtyři sloupce.Řádky představují továrny a sloupce představují trhy, na které továrny dodávají.Hodnoty jsou náklady na dopravu z továren na trhy.První dimenze pole je vynechána, ale kompilátor ji doplní porovnáním inicializátoru.
Témata v tomto oddílu:
Příklad
Metodu vynechání specifikace hranice pro první dimenzi vícerozměrného pole lze také použít v příkazech funkce takto:
// multidimensional_arrays.cpp
// compile with: /EHsc
// arguments: 3
#include <limits> // Includes DBL_MAX
#include <iostream>
const int cMkts = 4, cFacts = 2;
// Declare a float that represents the transportation costs
double TransportCosts[][cMkts] = {
{ 32.19, 47.29, 31.99, 19.11 },
{ 11.29, 22.49, 33.47, 17.29 },
{ 41.97, 22.09, 9.76, 22.55 }
};
// Calculate size of unspecified dimension
const int cFactories = sizeof TransportCosts /
sizeof( double[cMkts] );
double FindMinToMkt( int Mkt, double myTransportCosts[][cMkts], int mycFacts);
using namespace std;
int main( int argc, char *argv[] ) {
double MinCost;
if (argv[1] == 0) {
cout << "You must specify the number of markets." << endl;
exit(0);
}
MinCost = FindMinToMkt( *argv[1] - '0', TransportCosts, cFacts);
cout << "The minimum cost to Market " << argv[1] << " is: "
<< MinCost << "\n";
}
double FindMinToMkt(int Mkt, double myTransportCosts[][cMkts], int mycFacts) {
double MinCost = DBL_MAX;
for( int i = 0; i < cFacts; ++i )
MinCost = (MinCost < TransportCosts[i][Mkt]) ?
MinCost : TransportCosts[i][Mkt];
return MinCost;
}
Komentáře
Funkce FindMinToMkt je napsána tak, že přidání nové továrny nevyžaduje změnu kódu, stačí provést rekompilaci.