将 std::vector<std::vector<std::string>> 转换为 std::vector<std::vector<std::variant<Types...>>>

问题描述 投票:0回答:1
template <class... Types>
class Dataframe
{
public:
    Dataframe(const std::vector<std::vector<std::string>>& input);
    std::vector<std::vector<std::variant<Types...>>> Data() {
        return data_;
    }

private:
    std::vector<std::vector<std::variant<Types...>>> data_;
};


std::vector<std::vector<std::string>> input = {{"2024-03-03", "1.3", "1"}, {"2024-04-04", "3.4", "10"}}

auto df = Dataframe<std::string, double, int>(input);
df.Data(); //expected output: {{"2024-03-03", "2024-04-04"}, {1.3, 3.4}, {1, 10}}


auto df_2 = Dataframe<std::string, int, double>(input); // Can also handle this 
df_2.Data(); //expected output: {{"2024-03-03", "2024-04-04"}, {1, 3}, {1.0, 10.0}}  

我正在尝试创建一个具有动态类型签名的数据帧类来处理多种数据类型。我是模板(以及一般的 C++)新手。我正在尝试创建一个类似于 pandas dataframe 的类,这样我就可以通过列获取平均值、滚动平均值等。

  1. 这是正确的做法吗?还是
    std::vector<std::tuple<Types...>> data_;
    会更好?
  2. 如果这是正确的方法,由于
    Dataframe<std::string, int, double>
    的长度可能会有所不同,我如何创建
    std::vector<std::vector<std::variant<Types...>>> data_
    所以当我循环
    input
    时,我可以执行如下操作,但如何在这里考虑类型?
for (std::size_t i = 0; i < input.size(); ++i) {
    for (std::size_t j = 0; j < input[i].size(); ++j) {
        data_[i].push_back(input[i][j]);
    }
}

不是模板方面的专家,并且不断出错。

c++ c++20
1个回答
0
投票

也许是这样的:

Dataframe(const std::vector<std::vector<std::string>>& input) {
    for (const auto& v : input) {
        data_.emplace_back(v.begin(), v.end());
    }
}

演示

© www.soinside.com 2019 - 2024. All rights reserved.