diff --git a/SystemTools.cxx b/SystemTools.cxx
index 7140d94e66e4866bb83e06056dc4bbc51d1af705..790322720a8f68b3f37fc68bf6132b6fd2fa4d6e 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -2813,20 +2813,36 @@ void SystemTools::SplitPath(const char* p,
 kwsys_stl::string
 SystemTools::JoinPath(const kwsys_stl::vector<kwsys_stl::string>& components)
 {
+  return SystemTools::JoinPath(components.begin(), components.end());
+}
+
+//----------------------------------------------------------------------------
+kwsys_stl::string
+SystemTools
+::JoinPath(kwsys_stl::vector<kwsys_stl::string>::const_iterator first,
+           kwsys_stl::vector<kwsys_stl::string>::const_iterator last)
+{
+  // Construct result in a single string.
   kwsys_stl::string result;
-  if(components.size() > 0)
+
+  // The first two components do not add a slash.
+  if(first != last)
     {
-    result += components[0];
+    result += *first++;
     }
-  if(components.size() > 1)
+  if(first != last)
     {
-    result += components[1];
+    result += *first++;
     }
-  for(unsigned int i=2; i < components.size(); ++i)
+
+  // All remaining components are always separated with a slash.
+  while(first != last)
     {
     result += "/";
-    result += components[i];
+    result += *first++;
     }
+
+  // Return the concatenated result.
   return result;
 }
 
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index 48a528817723f51689953ea8aa6afad20a5edfab..cb9a5187b25a08b1a4fb2e138e55ccfbcf5740e8 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -364,6 +364,9 @@ public:
    */
   static kwsys_stl::string JoinPath(
     const kwsys_stl::vector<kwsys_stl::string>& components);
+  static kwsys_stl::string JoinPath(
+    kwsys_stl::vector<kwsys_stl::string>::const_iterator first,
+    kwsys_stl::vector<kwsys_stl::string>::const_iterator last);
 
   /**
    * Compare a path or components of a path.