Vector of Structures

18,965

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));
Share:
18,965
Robert
Author by

Robert

Updated on July 12, 2022

Comments

  • Robert
    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
    Victor Nicollet over 13 years
    Agreed. Turning this into an initialization from an array using PairId.assign() is probably what will require the least work.
  • Konrad Rudolph
    Konrad Rudolph over 13 years
    @Victor: PairID.assign is a nice hint, thanks. I’ve always just used copy with a back_inserter until now.
  • Victor Nicollet
    Victor Nicollet over 13 years
    Then 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
    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
    John Dibling over 13 years
    @Victor: But I seriously doubt that in an optimized build PigBen's solution will be any faster than this.