【问题标题】:Vector of Structures结构向量
【发布时间】:2011-05-08 12:53:37
【问题描述】:

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

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,不想更新我的编译器

【问题讨论】:

    标签: c++ vector struct


    【解决方案1】:

    您的代码不是合法的 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));
    

    【讨论】:

    • 再一次,PigBen 的答案中的临时数据可以变成一个常量静态变量,因此与您的解决方案相比,它占用的空间更少,复制速度更快。
    • @Victor:可以肯定的是,我可能会使用像 PigBen 这样的解决方案,除非出于某种原因我不想这样做。
    • @Victor:但我严重怀疑在优化构建中 PigBen 的解决方案会比这更快。
    【解决方案2】:

    为什么会失败?

    因为它不是有效的 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 标准头文件。)

    【讨论】:

    • 同意。使用PairId.assign() 将其转换为数组的初始化可能需要最少的工作。
    • @Victor: PairID.assign 是一个很好的提示,谢谢。直到现在,我一直只使用 copy 和 back_inserter。
    【解决方案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);
    }
    

    【讨论】:

      【解决方案4】:

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

      using std::vector<int>;
      using namespace boost::assign;
      vector<int> v = list_of(Pair("s11", "s12", true)(Pair("s21", "s22", false));
      

      【讨论】:

        【解决方案5】:
        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);
        

        【讨论】:

          【解决方案6】:

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

          您可以使用结构的任何临时实例并为其分配默认值,然后使用普通分配,例如

          typedef struct mystruct{
              int x;
              char name[10];
          }mystruct;
          
          mystruct default;
          default.x = 1;
          strcpy(default.name,"default_name");
          vector <mystruct> v(10,default);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-22
            • 1970-01-01
            • 2016-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多