Вектор структур - PullRequest
       20

Вектор структур

5 голосов
/ 11 ноября 2010

У меня есть некоторый код, данный мне другим человеком, в котором у нас есть структура

struct Pair {
    string s1;
    string s2;
    bool equivalent;
  };

Затем он устанавливает вектор этих структур в жестком коде

std::vector<Pair> PairID;

  staticdata() {
      PairID={{"string","string2",true}, 
      {"string","string3",true}, 
      {"string","string4",false}, 
      {"string","string7",false}, 
      {"string3","string8",false}
    };
    }

К сожалению, мойкомпилятор жалуется на строку PairID = {{"string", "string2", true},

Почему это так?Он предложил компилировать, используя -std = c ++ 0x, но мой компилятор (gcc 4.2) не поддерживает это.Есть ли простой способ конвертировать код, чтобы он работал?Почему происходит сбой ??

Я использую Mac OSX и предпочел бы не обновлять мой компилятор

Ответы [ 6 ]

7 голосов
/ 11 ноября 2010

Ваш код не является допустимым C ++. Это допустимый C ++ 0x, но в язык было внесено много изменений. Поэтому, если вы хотите скомпилировать этот код как код C ++, вам нужно его изменить.

Решение PigBen является односторонним, проблема в том, что временные данные могут создаваться и уничтожаться много раз, или жить долго.

Вот еще один способ:

    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));
6 голосов
/ 11 ноября 2010

Почему это не получается?

Потому что это недопустимый C ++. будет в C ++ 0x. Но на данный момент это просто недействительно. А поскольку ваш компилятор еще не поддерживает C ++ 0x, вам нужно будет сделать это сложным образом, то есть заполнить вектор одним элементом за раз или скопировать из массива C…

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));

(для этого потребуются стандартные заголовки algorithm и iterator.)

4 голосов
/ 11 ноября 2010
void staticdata() {
    Pair temp[] =
    {
        {"string","string2",true}, 
        {"string","string3",true}, 
        {"string","string4",false}, 
        {"string","string7",false}, 
        {"string3","string8",false}
    };

    PairID.assign(temp,temp+5);
}
1 голос
/ 11 ноября 2010

Вы можете использовать Boost.Assign, который является синтаксическим сахаром для создания вектора и последующего его заполнения:

using std::vector<int>;
using namespace boost::assign;
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
0 голосов
/ 08 июля 2018

Если вы заранее знаете размер вектора, вы можете перейти к этому

. Вы можете использовать любой временный экземпляр структуры и присвоить ему значения по умолчанию, а затем использовать обычное назначение, например

typedef struct mystruct{
    int x;
    char name[10];
}mystruct;

mystruct default;
default.x = 1;
strcpy(default.name,"default_name");
vector <mystruct> v(10,default);
0 голосов
/ 08 января 2018
struct Pair 
{
   string s1;
   string s2;
   bool equivalent;
};
std::vector<Pair> PairID;         

Pair pair;

pair.s1 = "abc";
pair.s2 = "abc";
pair.equivalent = TRUE;

PairID.push_back(pair);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...