Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构向量_C++_Vector_Struct - Fatal编程技术网

C++ 结构向量

C++ 结构向量,c++,vector,struct,C++,Vector,Struct,我有另一个人给我的一些代码,其中我们有一个结构 struct Pair { string s1; string s2; bool equivalent; }; 然后他建立了这些硬编码结构的向量 std::vector<Pair> PairID; staticdata() { PairID={{"string","string2",true}, {"string","string3",true}, {"stri

我有另一个人给我的一些代码,其中我们有一个结构

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}
    };
    }
std::vector PairID;
静态数据(){
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)不支持。有没有一种简单的方法来转换代码使其工作?为什么失败

我正在使用MacOSX,不想更新我的编译器

为什么会失败

因为它不是有效的C++,它将是在C++ 0x中。但是到目前为止,它还不正确。而且由于编译器还不支持C++ 0x,所以需要硬地执行,即一次填充向量一个元素,或者从C数组复制……/p>

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

(这将要求<代码>算法> <代码>迭代器< /C>标准头。)您的代码不是合法的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));
结构对{
字符串s1;
字符串s2;
布尔等价物;
};
配对(常量字符串和s1,常量字符串和s2,布尔等效)
{
配对ret;
ret.s1=s1;
ret.s2=s2;
ret.等效=等效;
返回ret;
}
//在初始化代码的某个地方。。。
std::向量PairID;
PairID.push_back(使_配对(“string”,“string2”,true));
PairID.push_back(使_配对(“string”,“string3”,true));
PairID.push_back(使_配对(“string”,“string4”,false));
PairID.push_back(使_配对(“string”,“string7”,false));
PairID.push_back(使_配对(“string3”,“string8”,false));

您可以使用Boost.Assign,它是创建向量然后填充向量的语法糖:

using std::vector<int>;
using namespace boost::assign;
vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
使用std::vector;
使用名称空间boost::assign;
向量v=(对(“s11”、“s12”,真)(对(“s21”、“s22”,假))的列表u;
结构对
{
字符串s1;
字符串s2;
布尔等价物;
};
std::向量PairID;
配对;
pair.s1=“abc”;
pair.s2=“abc”;
pair.equality=真;
PairID.向后推(一对);

如果你事先知道向量的大小,那么你可以这样做

您可以使用结构的任何临时实例,并将默认值指定给该实例,然后使用常规指定,如

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

mystruct default;
default.x = 1;
strcpy(default.name,"default_name");
vector <mystruct> v(10,default);
typedef结构mystruct{
int x;
字符名[10];
}我的结构;
我的结构违约;
默认值x=1;
strcpy(default.name,“default_name”);
向量v(10,默认值);

同意。使用
PairId.assign()将其从数组转换为初始化
可能是需要最少工作的地方。@Victor:
PairID.assign
是一个很好的提示,谢谢。我一直使用
copy
back\u inserter
直到现在。然后,PigBen答案中的临时数据可以变成一个常量静态变量,因此占用的空间更少,读取速度更快复制比您的解决方案更有效。@Victor:当然,我可能会使用类似PigBen的解决方案,除非出于任何原因我不想使用。@Victor:但我严重怀疑,在优化构建中,PigBen的解决方案会比这更快。
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);
typedef struct mystruct{
    int x;
    char name[10];
}mystruct;

mystruct default;
default.x = 1;
strcpy(default.name,"default_name");
vector <mystruct> v(10,default);