首頁>Program>source

是否有一个我可以使用或構建的C ++容器,其中可以包含 intstringdouble 型別? 我面临的問题是,每当我尝試使用以下內容填充地圖,向量或列表時:

int x;
string y;
double z;

我受製於以下格式:

list<int> mycountainer;
vector<string> mycontainer;

迫使 mycontainer 只包含一種型別。

在任何人建議使用泛型之前,自標準 vector以来這都不起作用 和 list C ++ are already generic隨附的容器 -它们可以是任何型別的容器,但不能包含多个型別。

如果可能的话,我也尽量避免使用Boost-如果有一種簡單的方法可以自己編寫代碼,我希望這樣做。

[編輯] 大家好,非常感谢您的建議-我應该解釋一下如何使用此容器,但這有點複雜,因此上面的(大)簡化了.我认為最好的選擇是使用Boost.再次感谢。

最新回復
  • 5月前
    1 #

    您可以使用(或重新實現) boost::any 並儲存 boost::any的例項 在一个容器中.自从 boost::any以来,那將是最安全的 在一般情况下,可能已经解決了解決此類問题的许多極端情况和複雜性。

    如果您想快速而肮脏地做某事,請建立一个結構或一个包含所有可能型別的成員以及该物件中"活動"型別的列舉或其他指示符的聯合.請特別註意工会,因為它们具有一些有趣的屬性(例如,如果您讀取了錯誤的工会成員,則呼叫未定義的行為,一次只能有一个成員處於"活動狀態",即最近寫入的一个). / p>

    我很好奇您在做什麼,但是您需要這樣的構造。

  • 5月前
    2 #

    好吧,第一个問题是: Why do you think you need to store objects of different, totally unrelated types in the same container? 在我看来,這很可恶.

    如果有需要,我会找 boost::variantboost::any .

  • 5月前
    3 #

    您想要的被稱為"異質容器".从技術上讲,C ++在STL中不支援它们,但是Boost支援。

    鉴於此,我想您会在以下問题中找到答案:如何製作異類的boostmap

  • 5月前
    4 #

    您可以使用結構,類或std: :對。

    [編輯]

    對於類和結構:

    struct XYZ {
        int x;
        string y;
        double z;
    };
    std::vector<XYZ> container;
    XYZ el;
    el.x = 10;
    el.y = "asd";
    el.z = 1.123;
    container.push_back(el);
    

    對於std :: pair:

    #include <pair>
    typedef std::pair<int, std::pair<string, double> > XYZ;
    std::vector<XYZ> container;
    container.push_back(std::make_pair(10, std::make_pair("asd", 1111.222)));
    

  • 5月前
    5 #

    您可以使用包含所有三个結構的結構。

    struct Data
    {
        int intVal;
        std::string stringVal;
        double doubleVal;
    };
    

    然後您可以宣告 list mycontainer<Data> 並使用適当的值,前提是您知道值的型別.如果没有,請在結構中添加一个附加欄位,以告诉您正在使用三種資料型別中的哪一種。

    struct Data
    {
        enum DATATYPE { DT_INT, DT_STRING, DT_DOUBLE } type;
        int intVal;
        std::string stringVal;
        double doubleVal;
    };
    

    如果您担心記憶體使用情况,則可以使用聯合,尽管我倾向於避免使用它们.不過對我来說這可能是不必要的妄想症。

  • html:如何在MVC中保持滚動位置?
  • select:MySQL-SQL_BIG_SELECTS