Home

The Array Class

 

Single-Dimensional Array Creation

An array is a technique of storing similar information of different items in a common variable of one name. Based on this, consider the following list:

Store Item
Women Coat
Men Jacket
Teen Jeans
Women Bathing Suit
Children Playground Dress

This type of list can be created using a String-based array. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *lstItemsNames[] = { S"Women Coat", S"Men Jacket", S"Teen Jeans",
		                        S"Women Bathing Suit", S"Children Playground Dress" };
}

The above type of list is referred to as a single-dimensional. To provide more information about items, you can associate a second or even a third list to the first as follows:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *itemsNumbers[] = { S"624376", S"274952", S"497852", S"749752", S"394085" };
	 String *lstItemsNames[]    = { S"Women Coat", S"Men Jacket", S"Teen Jeans",
		                             S"Women Bathing Suit", S"Children Playground Dress" };
	 double itemsPrices[]      = { 225.55, 175.75, 24.50, 34.65, 75.05 };
}

To support C++ arrays, the .NET Framework provides the Array class, which is defined in the System namespace. Based on this, you can formally use the Array class to create an array. To support the creation of an array, the Array class is equipped with the CreateInstance() method that comes in various versions. To create a one-dimensional array, you can use the following version:

public: static Array* CreateInstance(Type* elementType, int length);

The first argument is used to specify the type of array you want to create. Since it is declared as Type, you can use the __typeof operator to cast your type.

The second argument specifies the number of items of the list. Like a normal C++ array, the items in an Array-based list use a zero-based index, meaning that the first item has an index of 0, the second has an index of 1, and so on. Using the Array class, you can create a list of the above item names as follows:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 Array *lstItemsNames = Array::CreateInstance(__typeof(String), length);
}

Creating various lists that would be later connected can be confusing and even overwhelming, as mentioned earlier.

 

Practical Learning Practical Learning: Creating a List Class

  1. Start Microsoft Visual C++ .NET or Visual Studio .NET
  2. To start a new project, on the main menu, click File -> New -> Project...
  3. In the Project Types list, make sure Visual C++ Projects is selected
    In the Templates list, click Class Library (.NET)
  4. Set the Name to StoreItem
  5. Click OK
  6. In the Solution Explorer, double-click StoreItem.h
  7. Change the file as follows:
     
    // StoreItem.h
    
    #pragma once
    
    using namespace System;
    
    namespace StoreItem
    {
    	public __gc class CStoreItem
    	{
    	private:
    		String *nbr;
    		String *nm;
    		String *sz;
    		double  uprice;
    		
    	public:
    		CStoreItem(void)
    		{
    			nbr = S"";
    			nm  = S"";
    			sz  = S"";
    			uprice = 0.00;
    		}
    
    		CStoreItem(String *number, String *name, String *size, double price)
    		{
    			nbr    = number;
    			nm     = name;
    			sz     = size;
    			uprice = price;
    		}
    
    		__property String *get_ItemNumber()
    		{
    			return nbr;
    		}
    	
    		__property void set_ItemNumber(String *no)
    		{
    			nbr = no; 
    		}
    
    		__property String *get_ItemName()
    		{
    			return nm;
    		}
    
    		__property void set_ItemName(String *desc)
    		{
    			nm = desc;
    		}
    		__property String *get_Size()
    		{
    			return sz;
    		}
    
    		__property void set_Size(String *s)
    		{
    			sz = s;
    		}
    
    		__property double get_UnitPrice()
    		{
    			return uprice;
    		}
    
    		__property void set_UnitPrice(double price)
    		{
    			uprice = price;
    		}
    
    		virtual String *ToString()
    		{
    			return String::Concat(nbr, S" ", nm, S" ", sz, S" ", uprice);
    		}
    	};
    }
  8. On the main menu, click Project -> StoreItem Properties...
     
  9. Check that the string on the right side of Configuration Type displays DynamicLibrary (.dll) and click OK
  10. To create the library, on the main menu, click Build -> Build StoreItem 

The Length of an Array

In C++, when creating an array that you are not initializing, you must provide the number of items that the list will contain. This number is passed inside the variable's square brackets as a constant integer. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	String *lstItemsNames[] = __gc new String*[5];
}

If you create a list using the Array::CreateInstance() method using the above version, you must pass a constant integer as the second argument. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 Array *lstItemsNames = Array::CreateInstance(__typeof(String), 5);
}

If the array exists already, to find out the number of items it contains, you can access its Length property. Alternatively, you can call the Array::GetLength() method. Its syntax is:

public: int GetLength(int dimension);

For a single dimensional array as those declared above, you must pass the argument as 0. This method returns a 32-bit integer that represents the number of items in the array.

 

Practical Learning Practical Learning: Starting a List-Based Application

  1. To start a new application, on the main menu, click File -> New -> Project...
  2. In the Projects Types list, click Visual C++ Projects
  3. In the Templates list, click Windows Forms Application
  4. In the Name box replace the string with DepartmentStore1
  5. Click OK
  6. Open Windows Explorer or My Computer
  7. In the StoreItem folder, copy the StoreItem.dll file
  8. Display the contents of the current DepartmentStore1 folder and paste the StoreItem.dll file
  9. Return to the project
    To add the library to this project, in the Solution Explorer, right-click References and click Add Reference...
  10. In the Add Reference dialog box, click Browse...
  11. In the Select Component dialog box, select StoreItem.dll (it should be selected already) and click Open
     
    Select Component
  12. In the Add Reference dialog box, click OK
  13. Double-click the body of the form to access its Load event
  14. Change the file as follows:
     
    namespace DepartmentStore1
    {
    	. . . No Change 
    	
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    		}
      
    	. . . No Change 
    
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container * components;
    		Array *lstItemsInStore;
    
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			. . . No Change 
    
    		}	
    
    	private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 lstItemsInStore = Array::CreateInstance(__typeof(StoreItem::CStoreItem), 6);
    			 }
    
    	};
    }
  15. Design the form as follows:
     
    Department Store - Form Design
    Control Name Text Other Properties
    Label     Item #:  
    TextBox   txtItemNumber    
    Label     Description:  
    TextBox   txtDescription    
    Label     Size:  
    TextBox   txtSize    
    Label     UnitPrice:  
    TextBox   txtUnitPrice   TextAlign: Right
    Button   btnClose Close  
    Button   btnFirst | <  
    Button   btnPrevious <<  
    Button   btnNext >>  
    Button   btnLast > |  
  16. Save all

Operations on Arrays

 

Two-Dimensional Array Creation

 

The type of array we declared earlier is referred to as a single-dimensional. To provide more information about items, you can associate a second or even a third list to the first as follows:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *lstItemsNames[]    = { S"Women Coat", S"Men Jacket", S"Teen Jeans",
		                                 S"Women Bathing Suit", S"Children Playground Dress" };
}

You can create a two-dimensional array by entering a comma in the square brackets of the array variable and two constant integers separated by a comma when allocating memory for the array. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *lstItemsNames[,] = __gc new String*[2,3];				 
}

If you want to use the Array::CreateInstance() method to create a two-dimensional array, you can call the following version:

public: static Array* CreateInstance(Type* elementType, int length1, int length2);

A two-dimensional array is also called an array of two arrays. If using the classic technique of declaring an array, the first number specified when allocating memory, in the above example it would be 2, represents the number of arrays. This is the same number of the second argument of the current CreateInstance() method. For a two-dimensional array, this number is always 2. The second number of the classic declaration and the third argument of the current CreateInstance() method specify the number of items that each list would contain. In the above declaration, the number 3 means that each array will be made of three items.

Based on this, here is an example of declaring a two-dimensional array using the CreateInstance() method:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 Array *lstItemsNumbers = Array::CreateInstance(__typeof(String), 2, 3);
	 String *storeItems[,] = __gc new String*[2,3];
}

To know the total number of items that an array contains, you can access its Length property. To know the number of items that a particular list contains, call the Array::GetLength() method and pass the number corresponding to the array. To know the number of items in the first list, pass the argument as 0. To know the number of items in the second list, pass the argument as 1.

Multidimensional Array Creation

Besides the single or two-dimensional, you can create multidimensional arrays by specifying the number of commas in the square brackets and specifying the numbers in the right square brackets. If you want to use the Array::CreateInstance() method to create a multidimensional array, you can call the following version:

public: static Array* CreateInstance(Type* elementType, int lengths __gc[]);

With this version of the method, the second argument specifies the number of arrays that the variable will hold

If you want to find out the total number of items that an array contains, access its Length property. To get the number of items that a particular list contains, you can call the Array::GetLength() method and pass the number corresponding to the array.

To know the number of lists that an array variable contains, you can access its Rank property.

 

Adding Items to an Array

In C++, there are two main techniques you can use to initialize an array. You can create its list of items when declaring the array. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 double itemsPrices[] = { 225.55, 175.75, 24.50, 34.65, 75.05 };
}

Another technique C++ provides is to first declare the array, then initialize each of its members. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *storeItems[] = new String*[4];
				 
	 storeItems[0] = S"Women Coat";
	 storeItems[1] = S"Women Bathing Suit";
	 storeItems[2] = S"Quilted Down Jacket";
	 storeItems[3] = S"Men Jacket";
}

Here is an example for a two-dimensional array:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *storeItems[,] = __gc new String*[2,3];
				 
	 storeItems[0,0] = S"Women Coat";
	 storeItems[0,1] = S"Women Bathing Suit";
	 storeItems[0,2] = S"Quilted Down Jacket";
	 storeItems[1,0] = S"Men Jacket";
	 storeItems[1,1] = S"Children Playground Dress";
	 storeItems[1,2] = "Boys Trousers";
}

The Array class also provides its own support for adding items to an array. This is done using the Array::SetValue() that is overloaded with various versions. To add a new item to a single-dimensional array, you can use the following syntax:

public: void SetValue(Object* value, int index);

The first argument is the value to add to the list. The second argument is the index of the item to be added. The first item has index 1; the second item has index 2, and so on. Here is an example:

System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
{
	 String *storeItems[] = new String*[4];
				 
	 storeItems->SetValue(S"Women Coat", 0);
	 storeItems->SetValue(S"Women Bathing Suit", 1);
	 storeItems->SetValue(S"Quilted Down Jacket", 2);
	 storeItems->SetValue(S"Men Jacket", 3);
}

The Array class provides a SetValue() version for each corresponding CreateInstance() method we reviewed earlier.

 

Practical Learning Practical Learning: Adding Items to an Array

  1. To populate the array, change the Load event as follows:
     
    System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
    {
    	 lstItemsInStore = Array::CreateInstance(__typeof(StoreItem::CStoreItem), 6);
    
    	 StoreItem::CStoreItem *anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"724372";
    	 anItem->ItemName   = S"Women Coat";
    	 anItem->Size       = S"Large";
    	 anItem->UnitPrice  = 225.55;
    	 lstItemsInStore->SetValue(anItem, 0);
    
    	 anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"624376";
    	 anItem->ItemName   = S"Men Jacket";
    	 anItem->Size       = S"Medium";
    	 anItem->UnitPrice  = 175.75;
    	 lstItemsInStore->SetValue(anItem, 1);
    
                     anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"274952";
    	 anItem->ItemName   = S"Teen Jeans";
    	 anItem->Size       = S"14";
    	 anItem->UnitPrice  = 24.50;
    	 lstItemsInStore->SetValue(anItem, 2);
    
    	 anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"497852";
    	 anItem->ItemName   = S"Women Bathing Suit";
    	 anItem->Size       = S"Petite";
    	 anItem->UnitPrice  = 34.65;
    	 lstItemsInStore->SetValue(anItem, 3);
    
    	 anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"749752";
    	 anItem->ItemName   = S"Children Playground Dress";
    	 anItem->Size       = S"12";
    	 anItem->UnitPrice  = 75.05;
    	 lstItemsInStore->SetValue(anItem, 4);
    
    	 anItem = new StoreItem::CStoreItem;
    	 anItem->ItemNumber = S"394085";
    	 anItem->ItemName   = "Boys Trousers";
    	 anItem->Size       = S"8";
    	 anItem->UnitPrice  = 17.95;
    	 lstItemsInStore->SetValue(anItem, 5);
    }
  2. Save all

Array Members

 

Accessing the Members of an Array

Probably the most regularly performed operation on a list consists of retrieving the values of its members. In C++, you access the member of an array using its index as we saw earlier. To perform the same operation, the Array class is equipped with the GetValue() method that is overloaded with a version corresponding to each version of the CreateInstance() and the SetValue() method. For example, to access the values stored in a one-dimensional array, you can call call this version:

public: Object* GetValue(int index);

The argument is the zero-based index of the member whose value you want to access. If you pass an invalid value, the computer would throw an IndexOutOfRangeException exception.

Practical Learning Practical Learning: Accessing the Members of an Array

  1. Double-click the Close button and implement its Click event as follows:
     
    System::Void btnClose_Click(System::Object *  sender, System::EventArgs *  e)
    {
    	 Close();
    }
  2. Return to the form. Double-click each of the other button from left to right to generate their Click events
  3. To access each member of the array one at a time, implement the events as follows:
     
    #pragma once
    
    
    namespace DepartmentStore1
    {
    	. . . No Change
    
    	/// </summary>
    	public __gc class Form1 : public System::Windows::Forms::Form
    	{	
    	. . . No Change
    
    	private:
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		System::ComponentModel::Container * components;
    	private: System::Windows::Forms::Label *  label1;
    	private: System::Windows::Forms::TextBox *  txtItemNumber;
    	private: System::Windows::Forms::TextBox *  txtDescription;
    	private: System::Windows::Forms::Label *  label2;
    	private: System::Windows::Forms::TextBox *  txtUnitPrice;
    	private: System::Windows::Forms::Label *  label3;
    	private: System::Windows::Forms::TextBox *  txtSize;
    	private: System::Windows::Forms::Label *  label4;
    	private: System::Windows::Forms::Button *  btnFirst;
    	private: System::Windows::Forms::Button *  btnPrevious;
    	private: System::Windows::Forms::Button *  btnLast;
    	private: System::Windows::Forms::Button *  btnNext;
    	private: System::Windows::Forms::Button *  btnClose;
    			 Array *lstItemsInStore;
    			 int CurrentPosition;
    
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			. . . No Change
    		}	
    
    	private: System::Void Form1_Load(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 
    				 . . . No Change
    
    				 CurrentPosition = 0;
    				 btnFirst_Click(sender, e);
    			 }
    
    	private: System::Void btnClose_Click(System::Object *  sender, System::EventArgs *  e)
    			 {
    				 Close();
    			 }
    
    private: System::Void btnFirst_Click(System::Object *  sender, System::EventArgs *  e)
    {
    	 CurrentPosition = 0;
    
    	 try {
    		 StoreItem::CStoreItem *anItem = 
    			 dynamic_cast<StoreItem::CStoreItem *>(lstItemsInStore->GetValue(0));
    
    		 this->txtItemNumber->Text  = anItem->ItemNumber;
    		 this->txtDescription->Text = anItem->ItemName;
    		 this->txtSize->Text        = anItem->Size;
    		 this->txtUnitPrice->Text   = anItem->UnitPrice.ToString(S"C");
    	 }
    	 catch(IndexOutOfRangeException *)
    	 {
    		 MessageBox::Show(S"Invalid Index: Contact the administrator and report this error");
    	 }
    }
    
    private: System::Void btnPrevious_Click(System::Object *  sender, System::EventArgs *  e)
    {
    	 if( CurrentPosition == 0 )
    		 return;
    	 else
    	 {
    		 CurrentPosition--;
    
    		 try {
    			 StoreItem::CStoreItem *anItem = 
    				 dynamic_cast<StoreItem::CStoreItem *>(lstItemsInStore->GetValue(CurrentPosition));
    
    			 this->txtItemNumber->Text  = anItem->ItemNumber;
    			 this->txtDescription->Text = anItem->ItemName;
    			 this->txtSize->Text        = anItem->Size;
    			 this->txtUnitPrice->Text   = anItem->UnitPrice.ToString(S"C");
    		 }
    		 catch(IndexOutOfRangeException *)
    		 {
    			 MessageBox::Show(S"Invalid Index: Contact the administrator and report this error");
    		 }
    	 }
    }
    
    private: System::Void btnNext_Click(System::Object *  sender, System::EventArgs *  e)
    {
    	 if( CurrentPosition == (lstItemsInStore->GetLength(0) - 1) )
    		 return;
    	 else
    	 {
    		 CurrentPosition++;
    
    		 try {
    			 StoreItem::CStoreItem *anItem = 
    				 dynamic_cast<StoreItem::CStoreItem *>(lstItemsInStore->GetValue(CurrentPosition));
    
    			 this->txtItemNumber->Text  = anItem->ItemNumber;
    			 this->txtDescription->Text = anItem->ItemName;
    			 this->txtSize->Text        = anItem->Size;
    			 this->txtUnitPrice->Text   = anItem->UnitPrice.ToString(S"C");
    		 }
    		 catch(IndexOutOfRangeException *)
    		 {
    			 MessageBox::Show(S"Invalid Index: Contact the administrator and report this error");
    		 }
    	 }
    }
    
    private: System::Void btnLast_Click(System::Object *  sender, System::EventArgs *  e)
     {
    	 CurrentPosition = lstItemsInStore->GetLength(0) - 1;
    
    	 try {
    		 StoreItem::CStoreItem *anItem = 
    			 dynamic_cast<StoreItem::CStoreItem *>(lstItemsInStore->GetValue(CurrentPosition));
    
    		 this->txtItemNumber->Text  = anItem->ItemNumber;
    		 this->txtDescription->Text = anItem->ItemName;
    		 this->txtSize->Text        = anItem->Size;
    		 this->txtUnitPrice->Text   = anItem->UnitPrice.ToString(S"C");
    	 }
    	 catch(IndexOutOfRangeException *)
    	 {
    		 MessageBox::Show(S"Invalid Index: Contact the administrator and report this error");
    	 }
    }
  4. Execute the application to test it
     
  5. Close the form

The Arrangement of the List

When a new item is added to the array, it assumes the last position. If you want, you can re-arrange the list in a consecutive order. If the list is a one-dimensional array made of strings, you can arrange it in alphabetical order. If it is made of numbers, you can order them in increment or decrement order. If the list is a two, three, or multi-dimensional array, you can arrange it based on a list-part of your choice. To support the ability to re-organize the list, the Array class is equipped with the Sort() method that is overloaded with as many versions as you can possibly need.

To arrange a single-dimensional array in a consecutive order, you can call the following version of the Array::Sort() method:

public: static void Sort(Array* array);

To reverse the sequence of items of a one-dimensional array, you can call the Array::Reverse() method. Its syntax is:

public: static void Reverse(Array* array);

 

Looking for an Item in an Array

When using a list, you may want to know whether a particular item exists in the list. There are usually two ways to perform this operation. In a C++ array, you usually can use a for statement to scan a list. With this approach, you navigate through the list by visiting the index of each item and checking the value of that index. Another solution consists of writing a function to perform the search. The Array class provides its own support of both solutions using various methods that can be used to perform this operation.

The Array::IndexOf() method scans a list by accessing the index of each item. This method is overloaded in three versions. To apply it on a single-dimensional array, use the following version:

public: static int IndexOf(Array* array, Object* value);

This method visits each index of the array, looking for the value. Once it finds value in the array, it stops and returns the index where the first occurrence of value was found. The IndexOf() method actually looks for the first occurrence of an item in an array. If you prefer to get the last occurrence of that item in the array, you can call the Array::LastIndexOf() method. It also is overloaded in three versions.

 

Home Copyright © 2004-2010 FunctionX, Inc.