簡體   English   中英

矢量的變量類型向量

[英]vector of variable type vectors

我目前正在為C ++中的大表實現數據存儲。 該表需要能夠為每個可變數量的列存儲不同的數據類型。

定義每列的類型和長度以及運行時。 因此,我想,向量指針的向量將是正確的方法。 但是,我無法弄清楚如何使用可變數據類型執行此操作。

我看了如何在C ++中獲取不同向量的向量,但沒有動態解決方案。

我對任何其他解決方案持開放態度,我不一定需要向量,但是表格應該在運行時重新調整大小。

它應該看起來像這樣:

0  1  2  3    ...
-  -  -  -    -
1  a  0  1.3  ...
2  b  1  2.5  ...
3  c  0  1.5  ...
4  d  0  0.8  ...
5  e  1  1.2  ...
.. .. .. ...  ...

我有些人建議使用boost :: any但我有點不情願(在效率方面)因為表必須從磁盤加載大型數據包文件。

在boost中實現的任何類都將滿足您的需求。

以下是如何在其網站上使用它的示例:

#include <vector>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::vector<boost::any> many;

void append_int(many & values, int value)
{
    boost::any to_append = value;
    values.push_back(to_append);
}

void append_string(many & values, const std::string & value)
{
    values.push_back(value);
}

void append_char_ptr(many & values, const char * value)
{
    values.push_back(value);
}

void append_any(many & values, const boost::any & value)
{
    values.push_back(value);
}

void append_nothing(many & values)
{
    values.push_back(boost::any());
}

在向量中存儲不同類型是不可能的,但如果存儲沒有類型的指針( void* ),則可以將其重新鍵入任何所需的類型。 如果您在運行時不知道您正在讀什么類型,那么使包含指針void *和變量的struct來確定類型。

因為我使用C ++,所以這個例子可能只是偽C ++。

#include<vector>
#include<iostream>

void workWithCharArray(char* c);

typedef struct mytype {
    int type = 0;   // this defining default values is available since C++11
    void* var = nullptr;
} Mytype;

int main() {
    char* ptr = (char*)"Testing string";
    std::vector<Mytype> container;
    Mytype tostore;
    tostore.type = 1;
    tostore.var = (void*)ptr;

    container.append(tostore);

    switch (tostore.type) {
        case 1:
            workWithCharArray((char*)tostore.var);
            break;
        default:
            std::cerr << "Unknown type - Error handling";
    }

    return 0;
}

void workWithCharArray(char* c) {
    std::cout << c << std::endl;
}

如果你不能使用boost並且不想重新實現boost::any你可以使用void *作為窮人的任何容器。 表級別是std::vector<void *> ,每列(類型為T)都是std::vector<T> 然后依次分配每個列並將列的地址存儲在初始的std::vector<void *>

如果在使用之前轉換每列的值,它應該可以工作。 根據您的要求,正確實現它可能或多或少變得簡單,因為當您有原始指針時,您應該仔細實現析構函數,並在適當時復制移動構造函數和分配或聲明它們被刪除。 但這是一個(窮人)提升替代品......

如果你需要一個存儲不同數據類型的一維向量的二維向量,你可以為內向量創建一個抽象的,非模板化的基類,然后利用多態性在外向量中存儲指向該抽象基類的指針。如果你想在抽象矢量上調用成員函數。

class AbstractVector {
    ... // provide pure virtual interface here
}

template<class T>
class MyVector : public AbstractVector, public std::vector<T> { 
    ... /* provide implementation of pure virtual interface using 
           already available functionality from std::vector here */
}

在您的實現中,您可以存儲指向基類AbstractVector (或unique_ptrsshared_ptrs指針,具體取決於您要執行的操作):

std::vector<AbstractVector *> table;
MyVector<int> * columnOne = new MyVector<int>;
MyVector<float> * columnTwo = new MyVector<float>;
table.push_back(columnOne);
table.push_back(columnTwo);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM