The foreach loop is used to quickly iterate over the elements of a container (array, vectors, etc.) without performing initialization, testing, or increment/decrement. Foreach loops work by doing something for each element rather than doing something n times. Although there is no foreach loop in C, it is supported by C++ and Java. It was first introduced in C++ in C++ 11, and in Java in JDK 1.5.0. In both C++ and Java, the keyword for foreach loop is "for."
Syntax
for (data_type variable_name : container_type) {
operations using variable_name
}
We no longer need to specify the data type for variables in foreach loops thanks to the introduction of the auto keyword in C++ and the var keyword in Java. Type inference detects the data type of the container and sets the variable used for traversing to the same data type.
The code below demonstrates the use of a foreach loop for various containers, as well as the auto/var keywords in C++/Java.
// C++ program to demonstrate use of foreach for array
#include <iostream>
using namespace std;
int main()
{
int arr[] = { 10, 20, 30, 40 };
// Printing elements of an array using
// foreach loop
// Here, int is the data type, x is the variable name
// and arr is the array for which we want to iterate foreach
cout<<"Traversing the array with foreach using array's data type: ";
for (int x : arr)
cout<<x<<" ";
// data type of x is set as int
cout<<"\nTraversing the array with foreach using auto keyword : ";
for (auto x : arr)
cout<<x<<" ";
}
// Java program to demonstrate use of foreach
public class Main {
public static void main(String[] args)
{
// Declaring 1-D array with size 4
int arr[] = { 10, 20, 30, 40 };
// Printing elements of an array using
// foreach loop
// Here, int is the data type, x is the variable name
// and arr is the array for which we want to iterate foreach
System.out.print("Traversing the array with foreach using array's data type: ");
for (int x : arr)
System.out.print(x+" ");
// data type of x is set as int
System.out.print("\nTraversing the array with foreach using auto keyword : ");
for (var x : arr)
System.out.print(x+" ");
}
}
Output
Traversing the array with foreach using array's data type: 10 20 30 40
Traversing the array with foreach using auto keyword : 10 20 30 40
Vector C++ programme:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<string> value{"This", "is", "foreach", "example", "using", "vector."};
cout<<"Traversing the vector with foreach using vector's data type: ";
for (string v : value) {
cout<<v<<" ";
}
cout<<"\nTraversing the vector with foreach using auto keyword : ";
for (auto v : value)
cout<<v<<" ";
return 0;
}
Output
Traversing the vector with foreach using vector's data type: This is foreach example using vector.
Traversing the vector with foreach using auto keyword : This is foreach example using vector.
C++/Java Set Program:
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> value = {6, 2, 7, 4, 10, 5, 1};
cout<<"Traversing the set with foreach using set's data type: ";
for (int v : value) {
cout<<v<<" ";
}
cout<<"\nTraversing the set with foreach using auto keyword : ";
for (auto v : value)
cout<<v<<" ";
return 0;
}
import java.util.*;
public class GFG {
public static void main(String[] args)
{
Set<String> hash_Set = new HashSet<String>();
hash_Set.add("Geeks");
hash_Set.add("For");
hash_Set.add("Geeks");
hash_Set.add("Foreach");
hash_Set.add("Example");
hash_Set.add("Set");
System.out.print("Traversing the set with foreach using set's data type: ");
for(String hs : hash_Set) {
System.out.print(hs+" ");
}
System.out.print("\nTraversing the set with foreach using auto keyword : ");
for (var hs : hash_Set) {
System.out.print(hs+" ");
}
}
}
Output
Traversing the set with foreach using set's data type: 1 2 4 5 6 7 10
Traversing the set with foreach using auto keyword : 1 2 4 5 6 7 10
For array, vector, and set, we can use different data types in foreach.
C++/Java Map Program:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> mapExample;
mapExample.insert(pair<int, string>(1, "Geeks"));
mapExample.insert(pair<int, string>(2, "4"));
mapExample.insert(pair<int, string>(3, "Geeks"));
mapExample.insert(pair<int, string>(4, "Map"));
mapExample.insert(pair<int, string>(5, "Foreach"));
mapExample.insert(pair<int, string>(6, "Example"));
cout<<"Traversing the map with foreach using map's data type\n";
for (pair<int, string> mpEx : mapExample ) {
cout<<mpEx.first<<" "<<mpEx.second<<endl;
}
cout<<"\nTraversing the map with foreach using auto keyword\n";
for (auto mpEx : mapExample){
cout<<mpEx.first<<" "<<mpEx.second<<endl;
}
return 0;
}
import java.io.*;
import java.util.Map;
import java.util.HashMap;
class GFG {
public static void main (String[] args) {
Map<Integer,String> gfg = new HashMap<Integer,String>();
gfg.put(1, "Geeks");
gfg.put(2, "4");
gfg.put(3, "Geeks");
gfg.put(4, "Map");
gfg.put(5, "Foreach");
gfg.put(6, "Example");
System.out.println("Traversing the map with foreach using map's data type");
for (Map.Entry<Integer, String> entry : gfg.entrySet())
System.out.println(entry.getKey() + " " + entry.getValue());
System.out.println("\nTraversing the map with foreach using auto keyword");
for (var entry : gfg.entrySet())
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
Output
Traversing the map with foreach using map's data type
1 Geeks
2 4
3 Geeks
4 Map
5 Foreach
6 Example
Traversing the map with foreach using auto keyword
1 Geeks
2 4
3 Geeks
4 Map
5 Foreach
6 Example
Foreach loop has the following advantages:
- This improves the readability of the code.
- Removes the possibility of data over- or under-running errors.
- It is not possible to iterate over the elements in reverse order.
- Every element will be accessed; no elements in between will be skipped.