Utils - combine

- Implemented combine, which takes two integer vectors and combines
  them resulting in a single vector contianing the unique values of
  both.
This commit is contained in:
Paul Beckingham 2011-05-28 09:49:22 -04:00
parent 8fabffe18c
commit 8f85b0e194
3 changed files with 50 additions and 1 deletions

View file

@ -381,6 +381,27 @@ std::string compressIds (const std::vector <int>& ids)
return result.str ();
}
////////////////////////////////////////////////////////////////////////////////
void combine (std::vector <int>& dest, const std::vector <int>& source)
{
// Create a map using the sequence elements as keys. This will create a
// unique list, with no duplicates.
std::map <int, int> both;
std::vector <int>::iterator i1;
for (i1 = dest.begin (); i1 != dest.end (); ++i1) both[*i1] = 0;
std::vector <int>::const_iterator i2;
for (i2 = source.begin (); i2 != source.end (); ++i2) both[*i2] = 0;
// Now make a sequence out of the keys of the map.
dest.clear ();
std::map <int, int>::iterator i3;
for (i3 = both.begin (); i3 != both.end (); ++i3)
dest.push_back (i3->first);
std::sort (dest.begin (), dest.end ());
}
////////////////////////////////////////////////////////////////////////////////
// Run an external executable with execvp. This means stdio goes to
// the child process, so that it can receive user input (e.g. passwords).

View file

@ -72,6 +72,7 @@ int execute (const std::string&, std::vector<std::string>);
#endif
std::string compressIds (const std::vector <int>&);
void combine (std::vector <int>&, const std::vector <int>&);
#endif
////////////////////////////////////////////////////////////////////////////////

View file

@ -34,7 +34,7 @@ Context context;
////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv)
{
UnitTest t (19);
UnitTest t (30);
// TODO bool confirm (const std::string&);
// TODO int confirm3 (const std::string&);
@ -85,6 +85,33 @@ int main (int argc, char** argv)
output = taskDifferences (right, rightAgain);
t.ok (output.find ("No changes will be made") != std::string::npos, "No changes detected");
// void combine (std::vector <int>&, const std::vector <int>&);
std::vector <int> vleft;
vleft.push_back (1);
vleft.push_back (2);
vleft.push_back (3);
std::vector <int> vright;
vright.push_back (4);
combine (vleft, vright);
t.is (vleft.size (), (size_t)4, "1,2,3 + 4 -> [4]");
t.is (vleft[0], 1, "1,2,3 + 4 -> 1,2,3,4");
t.is (vleft[1], 2, "1,2,3 + 4 -> 1,2,3,4");
t.is (vleft[2], 3, "1,2,3 + 4 -> 1,2,3,4");
t.is (vleft[3], 4, "1,2,3 + 4 -> 1,2,3,4");
vright.push_back (3);
vright.push_back (5);
combine (vleft, vright);
t.is (vleft.size (), (size_t)5, "1,2,3,4 + 3,4,5 -> [5]");
t.is (vleft[0], 1, "1,2,3,4 + 3,4,5 -> 1,2,3,4,5");
t.is (vleft[1], 2, "1,2,3,4 + 3,4,5 -> 1,2,3,4,5");
t.is (vleft[2], 3, "1,2,3,4 + 3,4,5 -> 1,2,3,4,5");
t.is (vleft[3], 4, "1,2,3,4 + 3,4,5 -> 1,2,3,4,5");
t.is (vleft[4], 5, "1,2,3,4 + 3,4,5 -> 1,2,3,4,5");
return 0;
}