返回字符串和不同向量数据类型的映射C++



我知道以前有人问过这样的问题,但我仍在努力寻找答案。

我正在尝试返回一种mapstringvector的方法;我有两个向量std::vector<Eigen::MatrixXd> samplesstd::vector<std::string> sample_names

这是我到目前为止所做的:

std::map<std::string, std::vector> FileReader::get_data() {
std::map<std::string, std::vector> content;
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> sample_names;
for (auto i : list_dir()) {
if (contains_number(i)) {
samples.push_back(load_csv(location + "/" + i));
sample_names.push_back(i);
}
}
content["samples"] = samples;
content["sample_names"] = sample_names;
return content;
}

显然,我收到一个错误

error: type/value mismatch at argument 2 in template parameter list for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
std::map<std::string, std::vector> get_data(void);

因为我在方法中没有用于vector的数据类型。如果我加上stringEigen::MatrixXd它们就不能齐头并进。我知道我可以使用boost::any但它将是一个需要编译的额外库(?(,并且C++不是动态类型的。

有什么方法可以通过没有额外的库来做到这一点吗?

更新-1:

我认为我可以做的另一种方法是在构造函数中有一个私有变量vector<Eigen::MatriXd> samples&vector<std::string> smaple_names并创建两个相同向量类型的方法get_samples()get_sample_names()然后使用this->samples = samplesthis->sample_name之类的东西。这是唯一的其他方法吗?

更新-2:

看起来std::any是在 C++17 - http://en.cppreference.com/w/cpp/header/any。如果any一个:p感兴趣。

更新-3:

如果有人正在寻找答案,它就在

https://stackoverflow.com/a/44896365/3782963

我同意std::any(或boost::any(对于这种情况来说有点矫枉过正。std::variant(或boost::variant(在这里会是更好的选择,因为您确切地知道要存储的 2 种类型。

如果您不想使用任何其他库(如 Boost(并且无法访问 C++17,您可以尝试在虚拟实现中模拟自己std::variant(如果您不能/不想编写完整的(。像这样:

struct data {
// constructors...
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> names;
int index = -1;
};

然后,您可以将数据存储在std::map<std::string, data>中:

std::map<std::string, data> content;
content.emplace(std::make_pair("samples", data{samples, 0}));
content.emplace(std::make_pair("sample_names", data{sample_names, 1}));

然后,您只需要检查索引即可知道必须使用哪个std::vector

为什么要使用地图?您可以改用std::pair<std::vector<std::string>, std::vector<Eigen::MatrixXd>>

以下是该函数的外观:

std::pair<std::vector<std::string>, std::vector<Eigen::MatrixXd>> FileReader::get_data() 
{
std::vector<Eigen::MatrixXd> samples;
std::vector<std::string> sample_names;
for (auto i : list_dir()) {
if (contains_number(i)) {
samples.push_back(load_csv(location + "/" + i));
sample_names.push_back(i);
}
}
return std::make_pair(sample_names, samples);
}

如果您使用的是 C++11,则可以将 return 语句替换为

return {sample_names, samples};

最新更新