Vector of Structures
Solution 1
Your code is not legal C++. It is legal C++0x but there have been many changes to the language. So if you want to compile this code as C++ code, you'll need to change it.
PigBen's solution is one way, the problem with it being the temporary data could be constructed & destroyed many times, or live for a long time.
Here's another way:
struct Pair {
string s1;
string s2;
bool equivalent;
};
Pair make_Pair(const string& s1, const string& s2, bool equivalent)
{
Pair ret;
ret.s1 = s1;
ret.s2 = s2;
ret.equivalent = equivalent;
return ret;
}
// somewhere in the init code...
std::vector<Pair> PairID;
PairID.push_back(make_Pair("string","string2",true));
PairID.push_back(make_Pair("string","string3",true));
PairID.push_back(make_Pair("string","string4",false));
PairID.push_back(make_Pair("string","string7",false));
PairID.push_back(make_Pair("string3","string8",false));
Solution 2
Why is it failing?
Because it’s not valid C++. It will be, in C++0x. But as of yet, it’s just not valid. And since your compiler doesn’t yet support C++0x, you will need to do it the hard way, i.e. populate the vector one element at a time, or copy from a C array …:
Pair data[] ={ {"string","string2",true},
{"string","string3",true},
{"string","string4",false},
{"string","string7",false},
{"string3","string8",false} };
PairID.assign(data, data + sizeof(data) / sizeof(Pair));
(This will require the algorithm
and iterator
standard headers.)
Solution 3
void staticdata() {
Pair temp[] =
{
{"string","string2",true},
{"string","string3",true},
{"string","string4",false},
{"string","string7",false},
{"string3","string8",false}
};
PairID.assign(temp,temp+5);
}
Solution 4
You can use Boost.Assign, which is a syntactic sugar for creating a vector and then populating it:
using std::vector<int>;
using namespace boost::assign;
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
Robert
Updated on July 12, 2022Comments
-
Robert almost 2 years
I have some code given to me by another person in which we have a structure
struct Pair { string s1; string s2; bool equivalent; };
Then he sets up a vector of these structs hard coded
std::vector<Pair> PairID; staticdata() { PairID={{"string","string2",true}, {"string","string3",true}, {"string","string4",false}, {"string","string7",false}, {"string3","string8",false} }; }
Unfortunately my compiler is complaining on the line PairID={{"string","string2",true},
Why is this? He suggested to compile using -std=c++0x but my compiler (gcc 4.2) does not support this. Is there an easy way to convert the code so it works? Why is it failing??
I am using Mac OSX and would prefer not to update my compiler
-
Victor Nicollet over 13 yearsAgreed. Turning this into an initialization from an array using
PairId.assign()
is probably what will require the least work. -
Konrad Rudolph over 13 years@Victor:
PairID.assign
is a nice hint, thanks. I’ve always just usedcopy
with aback_inserter
until now. -
Victor Nicollet over 13 yearsThen again, the temporary data in PigBen's answer could be made into a constant static variable, which would therefore take less room and be faster to copy than your solution.
-
John Dibling over 13 years@Victor: To be sure, I would probably use a solution like PigBen's unless for whatever reason I didn't want to.
-
John Dibling over 13 years@Victor: But I seriously doubt that in an optimized build PigBen's solution will be any faster than this.