繁体   English   中英

转换 std::vector <std::vector<std::string> &gt; 到 std::vector <std::vector<double> &gt;

[英]Converting std::vector<std::vector<std::string>> to std::vector<std::vector<double>>

是否可以遍历字符串的二维向量并将字符串转换为双精度型? 如果是这样,这样做的最佳方法是什么? 我对二维向量和迭代器缺乏经验,所以如果之前有人问过这个问题,我深表歉意。 我试图找到解决方案,但运气不佳。

这是我的二维向量输入的一个小样本:

图片

我试图在下面的代码中遍历我的二维向量,希望我可以使用 std::stod() 来解析字符串并将它们转换为双精度值,但它没有用。

// Here is my original vector which I filled by taking input from a csv file
std::vector<std::vector<std::string>> original_matrix;

std::vector<std::vector<double>> doubles_matrix;
doubles_matrix.reserve(original_matrix.size());
for(auto beg = original_matrix.begin(); beg != original_matrix.end(); ++beg)
{
    for(auto ceg = beg->begin(); ceg != beg->end(); ++ceg) {

    }
}

首先。 您的问题有一百万种解决方案。 每个人都可以使用他想要的东西。 风格不一样。 与复杂的“现代 C++”解决方案相比,新手通常更喜欢 C 风格的解决方案。

我非常谦虚,(仅我个人的意见)用户“超级”(+1)的答案远远好于用户“selbie”的公认答案。 但是 OP 接受了它,因此,它是 OP 最合适的答案。

我想展示一个额外的解决方案,它与用户“super”相同,只是使用“更现代”的 C++ 元素。

你有一个二维std::vector 这是一个非常好的方法。 现在您想将std::string std::vectorstd::vector转换为不同的数据类型。 您甚至在问题中使用了“转换”标签。

对于这种转换,您可以使用 C++ 库中的一个函数,该函数正是为此目的而制作的。 它被称为std::transform

它将容器中的元素转换为不同的东西。 它遍历容器中的每个元素,然后使用“函数”(例如 lambda)来转换该元素。

对于二维向量,我们需要对每个维度应用std::transform

由于 C++ 中存在这样一个专用函数,我建议使用它。

请参阅以下示例:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>

int main() {

    // The source data
    std::vector<std::vector<std::string>> vvs{ {"1","2","3","4"},{"5","6","7","8"},{"9","10","11","12"},{"13","14","15","16"}};

    // Here we will store the result
    std::vector<std::vector<double>> vvd{};

    // Transform 2 dimensional vector
    // Outer vector
    std::transform(vvs.begin(), vvs.end(), std::back_inserter(vvd), [](const std::vector<std::string>&vs) {
        std::vector<double> vd{};
        // Inner vector
        std::transform(vs.begin(), vs.end(), std::back_inserter(vd), [](const std::string& s) { return std::stod(s); });
        return vd;
        });

    // Show debug output
    std::for_each(vvd.begin(), vvd.end(), [](const std::vector<double>& vd) {
        std::copy(vd.begin(), vd.end(), std::ostream_iterator<double>(std::cout, " ")); std::cout << "\n"; });

    return 0;
}

但是,正如所说,每个人都可以做他想做的事。

#include <vector>
#include <string>

auto convertVector(std::vector<std::vector<std::string>>& stringVec) {
    std::vector<std::vector<double>> output;
    for (auto& vec : stringVec) {
        output.push_back({});
        for (auto& str : vec) {
            output.back().push_back(std::stod(str));
        }
    }

    return output;
}

使用strtod函数将字符串转换为双精度

string s = 3.14;
double d = strtod(s.c_str(), nullptr);

然后以任何你想要的方式应用上面我对向量的循环。 下面是一个例子:

void convert(const vector<vector<string>>& stringVectors, vector<vector<double>>& doubleVectors)
{
    doubleVectors.clear();
    doubleVectors.resize(stringVectors.size());

    for (size_t i = 0; i < stringVectors.size(); i++) {
        auto& vs = stringVectors[i];
        auto& vd = doubleVectors[i];
        vd.resize(vs.size());
        for (size_t j = 0; j < vs.size(); j++) {
            vd[j] = strtod(vs[j].c_str(), nullptr);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM