Skip to content

Instantly share code, notes, and snippets.

@hraftery
Last active February 13, 2025 11:38
Show Gist options
  • Save hraftery/5110efa7c768a2e97bfb4e76a34b6250 to your computer and use it in GitHub Desktop.
Save hraftery/5110efa7c768a2e97bfb4e76a34b6250 to your computer and use it in GitHub Desktop.
C++ iterator challenge
#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