Last active
February 13, 2025 11:38
-
-
Save hraftery/5110efa7c768a2e97bfb4e76a34b6250 to your computer and use it in GitHub Desktop.
C++ iterator challenge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
using namespace std; | |
class C | |
{ | |
typedef struct { | |
double position; | |
double value1; | |
double value2; | |
} ElementA; | |
typedef struct { | |
double position; | |
double value3; | |
double value4; | |
} ElementB; | |
typedef enum { | |
Field1, | |
Field2, | |
Field3, | |
Field4 | |
} ValueSource; | |
vector<ElementA> vecElementA; | |
vector<ElementB> vecElementB; | |
//By implementing "transform_iterator" or otherwise, how do I create an accessor | |
//that transforms elements of either vecElementA or vecElementB, depending on | |
//value of "theSource", and gives me access to them one-by-one, on-the-fly? | |
vector<pair<double,double>>::const_iterator MakePairs(ValueSource theSource) | |
{ | |
switch(theSource) | |
{ | |
case ValueSource::Field1: | |
return transform_iterator(vecElementA, [](const auto elem&) { make_pair(elem.position, elem.value1); }); | |
case ValueSource::Field2: | |
return transform_iterator(vecElementA, [](const auto elem&) { make_pair(elem.position, elem.value2); }); | |
case ValueSource::Field3: | |
return transform_iterator(vecElementB, [](const auto elem&) { make_pair(elem.position, elem.value3); }); | |
case ValueSource::Field4: | |
return transform_iterator(vecElementB, [](const auto elem&) { make_pair(elem.position, elem.value4); }); | |
} | |
} | |
} | |
#include <iostream> | |
int main(int, char**) | |
{ | |
C c; | |
c.vecElementA = <some data source>; | |
c.vecElementB = <some other data source>; | |
for(auto pair : c.MakePairs(ValueSource::Field1)) | |
{ | |
cout << pair.first << "," << pair.second << endl; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment