La classe Vector : un tableau d'éléments de même type en AS3.
Introduction
La classe Vector vous permet d'accéder à un vecteur et de le manipuler; un vecteur est un tableau dont les éléments possèdent tous le même type de données.
Le type de données des éléments d'un vecteur est appelé le type de base. Le type de base peut correspondre à n'importe quelle classe ou interface.
Création d'une occurrence de Vector
Le type de base est spécifié lorsque vous déclarez la variable d'un vecteur. La syntaxe utilisée est Vector.<T> où T représente le type de base.
-
var trimestre:Vector.;
Le type de base est aussi spécifié lors de l'appel au constructeur Vector.<T>()
-
var trimestre:Vector.<String>;
-
trimestre = new Vector.<String>();
Un vecteur peut possèder une longueur fixe et donc avoir un nombre d'éléments invariables. Le constructeur de la classe Vector possède deux arguments optionnels : la longueur initiale du vecteur dont la valeur par défaut est 0 et un booléen indiquant si cette longueur est fixe, dont la valeur par défaut est false.
-
var trimestre:Vector.<String>;
-
trimestre = new Vector.<String>(4, true);
Manipuler un vector
La manipulation d'un vecteur se fait en utilisant l'opérateur d'accès au tableau ([]) mais aussi en utilisant des méthodes identiques à la classe Array. Parmi ces méthodes, on retrouve : push(), pop(), shift(), unshift().
L'opérateur d'accès au tableau ([])
Il permet de définir ou de récupérer une valeur du vecteur.
-
var trimestre:Vector.<String>;
-
trimestre = new Vector.<String>(4, true);
-
trimestre[0] = "Janvier-Mars";
-
trimestre[1] = "Avril-Juin";
-
trimestre[2] = "Juillet-Septembre";
-
trimestre[3] = "Octobre-Décembre";
-
trace("1ère ligne du tableau : " + trimestre[0]);//1ère ligne du tableau : Janvier-Mars
-
trace(trimestre);//Janvier-Mars,Avril-Juin,Juillet-Septembre,Octobre-Décembre
La méthode push()
La méthode push() ajoute un ou plusieurs éléments à la fin d'un vecteur.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
mois.push("Janvier", "Février", "Mars", "Avril");
-
trace(mois);
Cette méthode renvoie la nouvelle longueur du vecteur.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElementsApresAjout:int = mois.push("Janvier", "Février", "Mars", "Avril");
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElementsApresAjout);
La méthode unshift()
La méthode unshift() ajoute un ou plusieurs éléments au début d'un vecteur et renvoie la nouvelle longueur du vecteur. Les autres éléments du vecteur sont décalés de leur position d'origine, n, vers n + le nombre de nouveaux éléments.
-
var duree:Vector.<int> = new Vector.<int>();
-
var nbDuree:int = duree.push(15, 20, 25);
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbDuree);
-
nbDuree = duree.unshift(5, 10);
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbDuree);
-
trace(duree);
Bug pour les types String et Object
Avec un vecteur de type String ou Object, la méthode unshift() ajoute les éléments mais supprime un nombre identique d'éléments depuis la fin du vecteur.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElements:int = mois.push("Mars", "Avril", "Mai", "Juin");
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
-
nbElements = mois.unshift("Janvier", "Février");
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
-
trace(mois);
Le bug est connu et répertorié : http://bugs.adobe.com/jira/browse/ASC-3620
La méthode pop()
La méthode pop() supprime le dernier élément du vecteur et renvoie cet élément. La propriété length du vecteur est diminuée d'une unité lorsque cette fonction est appelée.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril");
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
-
var elementSupprime:String = mois.pop();
-
trace(elementSupprime + " a été supprimé du vecteur");
-
trace("Nombre d'éléments dans le vecteur après la suppression : " + mois.length);
La méthode shift()
La méthode shift() supprime le premier élément du vecteur et renvoie cet élément. Les éléments restants du vecteur sont décalés de leur position d'origine, n, vers n -1.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril");
-
trace("Nombre d'éléments dans le vecteur après l'ajout : " + nbElements);
-
trace("Le premier élément avant la suppression est " + mois[0]);
-
var elementSupprime:String = mois.shift();
-
trace(elementSupprime + " a été supprimé du vecteur");
-
trace("Le premier élément après la suppression est " + mois[0]);
La méthode splice()
La méthode splice() ajoute et supprime des éléments dans un vecteur. Cette méthode modifie le vecteur sans faire de copie.
Suppression d'éléments
splice(startIndex, deleteCount);
Cette méthode permet de supprimer des éléments à partir d'un index du vecteur. Le premier paramètre de la méthode correspond à l'index de départ, le deuxième paramètre correspond au nombre d'éléments à supprimer. Ce nombre inclut l'élément spécifié dans le paramètre startIndex
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElements:int = mois.push("Janvier", "Février", "Mars", "Avril", "Mai", "Juin");
-
trace(mois)
-
/*Suppression de Avril et Mai
-
Avril a pour index : 3*/
-
mois.splice(3, 2);
-
trace(mois);
Ajout d'éléments
splice(startIndex, deleteCount, items);
Lors de l'ajout d'éléments, le paramètre startIndex indique la position à partir de laquelle l'insertion doit avoir lieu. Le paramètre deleteCount est défini avec une valeur à 0 afin de ne supprimer aucun élement. Le paramètre items représente une liste d'une ou de plusieurs valeurs séparées par une virgule.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
trace("Nombre d'éléments dans le vecteur avant l'ajout : " + mois.length);
-
var nbElements:int = mois.push("Janvier", "Février", "Mai", "Juin");
-
trace(mois)
-
mois.splice(2, 0, "Mars", "Avril");
-
trace(mois);
Ajout et suppression d'éléments
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
mois.push("Janvier", "Février", "Mars", "Juin", "Juillet", "Août");
-
trace(mois);
-
mois.splice(3, 2, "Avril", "Mai");
-
trace(mois);
Les erreurs associées à la classe Vector
L'erreur TypeError
Cette erreur est générée si un argument n'est pas une occurrence du type de base du vecteur.
Avec l'opérateur d'accès au tableau [], l'erreur est générée à la compilation.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
mois[0] = 12;

Avec la méthode push(), cette erreur est générée à l'exécution.
-
var mois:Vector.<Sprite>;
-
mois = new Vector.<Sprite>();
-
mois.push("Janvier");
-
trace(mois);

L'erreur RangeError
Un vecteur est un tableau dense. Contrairement à un tableau, qui peut posséder des valeurs dans les index 0 et 7 même s'il n'existe aucune valeur dans les positions 1 à 6, un vecteur doit posséder une valeur (ou la valeur null) dans chaque index.
Cette erreur sera générée si vous essayez d'insérer une valeur dans un index en dehors des limites.
-
var mois:Vector.<String>;
-
mois = new Vector.<String>();
-
mois[0] = "Janvier";
-
mois[1] = "Février";
-
mois[5] = "Mars";
-
trace(mois);

Si vous avez défini un vecteur de taille fixe, cette erreur sera générée en utilisant les méthodes
push(), shift(), unshift().
-
var mois:Vector.<String>;
-
mois = new Vector.<String>(4, true);
-
mois.push("Janvier");
-
trace(mois);

Gestion des performances
L'opérateur d'accès au tableau [] vs la méthode push()
Lors de l'ajout d'une seule valeur à la fois, l'opérateur d'accès au tableau [] se montre plus rapide que la méthode push().
-
var v1:Vector.<String>;
-
v1 = new Vector.<String>();
-
var time1:int = getTimer();
-
for(var i:int = 0; i<1000000; i++)
-
{
-
v1[i] = "i=" + i;
-
}
-
var time2:int = getTimer();
-
trace("Temps d'exécution en millisecondes avec [] : " + (time2 - time1));
-
-
var v2:Vector.<String>;
-
v2 = new Vector.<String>();
-
var time3:int = getTimer();
-
for(var j:int = 0; j<1000000; j++)
-
{
-
v2.push("j=" + j);
-
}
-
var time4:int = getTimer();
-
trace("Temps d'exécution en millisecondes avec push() : " + (time4 – time3));

Conclusion
Dans tous les cas où vous utilisez un objet Array dont tous les éléments possèdent le même type de données, il est préférable d'utiliser une occurrence de l'objet Vector.
Cependant, la classe Vector n'est disponible que pour Flash Player 10.






#1 by JeromeJ on 8 octobre 2009 - 22:31
Salut, tu expliques ce qu'est la classe Vector, comment l'utiliser et quelles sont ses méthodes.
Puis tu affirmes que, dans des cas précis, il est préférable de l'utiliser à la place de la classe Array.
Mais tu n'expliques pas pourquoi, est-ce moins volumineux ? Plus rapide ? Certes il est plus strict mais est-ce tout ?
(autrement dit: les seuls benchmarks faits sont à propos de différences internes à la classe elle même, mais pas de comparaison directe avec sa concurrente)
C'est peut-être du à mon manque de culture en programmation (car il me semble que la classe Vector n'est pas née avec AS3) mais il est aussi fort probable que je ne sois pas le seul dans ce cas.
Cordialement
#2 by tannoy on 9 octobre 2009 - 12:58
Bonjour Jerome,
Dans mon article, je ne dis qu'une seule fois qu'il est préférable de l’utiliser à la place de la classe Array.
Dans tous les cas où vous utilisez un objet Array dont tous les éléments possèdent le même type de données, il est préférable d'utiliser une occurrence de l'objet Vector.
Dans ce cas précis, je pense que la phrase est assez claire.
D'autre part, le but de mon article n'était pas de comparer la classe Array a la classe Vector mais bien de présenter l'utilisation de la classe Vector.
Concernant les benchmarks de cette classe, je te propose un article de Mike Chambers ainsi qu'un extrait en PDF du livre de Thibault Imbert (Page 28)