FAQ C++/CLI et VC++.NetConsultez toutes les FAQ

Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013 

 
OuvrirSommaireLe langage C++/CLITableaux, Collections et énumérations

Pour utiliser un tableau en C++/CLI, vous pouvez utiliser le mot clé array du namespace cli.
Ainsi, vous pouvez déclarer un tableau et l'initialiser en une fois ou élément après élément.

 
Sélectionnez

cli::array<String^>^ tabChaine = { "Element 1", "Element 2", "Element 3"};
				
 
Sélectionnez

cli::array<String ^, 1> ^ tabChaine = gcnew cli::array<String ^>(3);
tabChaine[0] = "Element 1";
tabChaine[1] = "Element 2";
tabChaine[2] = "Element 3";
				

Pour accéder aux éléments du tableau, on peut utiliser l'accès direct avec [] ou dans une boucle for each.

 
Sélectionnez

for (int i=0;i<tabChaine->Length;i++)
	Console::WriteLine(tabChaine[i]);				
				
 
Sélectionnez

for each (String ^ s in tabChaine)
	Console::WriteLine(s);
				
Créé le 9 mai 2006  par nico-pyright(c)

Avec le framework .Net est apparu pour le C++ le mot clé for each. Il est très utile pour parcourir un tableau ou une collection.
Chaque itération initialise un objet qui contient la valeur courante de l'itération.

 
Sélectionnez

using namespace System;
using namespace System::Collections::Generic;				
 
List <String ^> ^ listChaine = gcnew List<String ^>();
listChaine>Add("element 1");
listChaine>Add("element 2");
 
for each (String ^ s in listChaine)
	Console::WriteLine(s);
				
Mis à jour le 12 juillet 2006  par nico-pyright(c)

Le namespace Array permet de trier des tableaux CLI grâce à la méthode Sort().

 
Sélectionnez

array<int>^ nombres = { 99, 43, 28, 11, 16, 52, 30};
Array::Sort(nombres);
for each(int nombre in nombres)
	Console::Write(nombre + " ");
				

Ceci affichera :

 
Sélectionnez

11 16 28 30 43 52 99
				
Créé le 9 mai 2006  par nico-pyright(c)

Le namespace Array permet de rechercher un objet dans des tableaux CLI grâce à la méthode IndexOf().
On peut aussi utiliser la méthode BinarySearch.

 
Sélectionnez

	array<String^>^ jours = { "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};
	int pos = Array::IndexOf(jours, "Mercredi");
	if (pos > 0)
		Console::WriteLine("Mercredi a été trouvé à la position {0}", pos );
	else
		Console::WriteLine("Mercredi n'a pas été trouvé");
				

Remarque : Si BinarySeach retourne une valeur négative, alors l'élément n'est pas trouvé. Cependant, avec cette valeur nous disposons d'une indication sur l'emplacement de l'élément qui est juste supérieur à la recherche.
Cela peut être utile pour insérer une valeur dans un tableau trié. Il suffit alors de faire un complément à zéro de la position :

 
Sélectionnez

pos = ~pos;				
				
Créé le 9 mai 2006  par nico-pyright(c)

Il peut être intéressant de faire en sorte que ses classes persos puissent être parcourues grâce au mot clé for each.

Pour ceci, il faut que la classe soit en mesure de fournir un objet IEnumerator et implémente l'interface IEnumerable afin de surcharger les méthodes MoveNext et Reset tout en permettant l'accès à la propriété Current.

Une solution est d'avoir une classe implémentant les interfaces IEnumerable et IEnumerator. Voici l'exemple d'une classe MyString, qui en l'occurence permet le parcours d'une chaîne avec for each (ce qui sert bien sur uniquement d'exemple, dans la mesure où la classe String le permet déjà).

 
Sélectionnez

using namespace System;
using namespace System::Collections;
 
public ref class MyString : public IEnumerable, public IEnumerator
{
private:
	String ^string_;
	int i;
public:
	MyString()
	{
		string_ = "";
		i = -1;
	}
	MyString(const char * c)
	{
		string_ = gcnew String(c);
		i = -1;
	}
	virtual bool MoveNext(void)
	{
		if ( i < string_->Length - 1 ) 
		{
			i++;
			return true;
		}
		return false;
	}
	virtual void Reset() {}
	property Object^ Current 
	{
		virtual Object^ get()
		{
			return string_[i];
		}
	};
	virtual IEnumerator^ GetEnumerator()
	{
		return this;
	}
};
 
int main() 
{
	MyString ^maChaine = gcnew MyString("abcd");
	for each ( Object^ c in maChaine )
		Console::WriteLine(c);
}				
				

On remarquera la méthode GetEnumerator qui renvoi this.

Une autre solution pourrait être d'utiliser une structure nested implémentant IEnumerator.

Créé le 12 juillet 2006  par nico-pyright(c)
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006-2007 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.