代码之家  ›  专栏  ›  技术社区  ›  Akshay shubaly

添加字符串向量和不同数据类型向量的映射

  •  0
  • Akshay shubaly  · 技术社区  · 7 年前

    如中所示 https://stackoverflow.com/a/44884240/3782963 std::map<std::string, Spikes::data> get_data1() struct 打电话 data

    struct data {
    
                std::vector<Eigen::MatrixXd> samples;
                std::vector<std::string> sample_names;
                int index = -1;
            };
    

    把它放在我的 namespace FileReader .

    我的方法如下:

    std::map<std::string, Spikes::data> FileReader::get_data1() {
        std::map<std::string, Spikes::data> 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.emplace(std::make_pair("samples", Spikes::data{samples,0}));
        content.emplace(std::make_pair("sample_names", Spikes::data{sample_names,1}));
    
        return content;
    

    在我的 main.cpp 我将此方法称为:

    for (auto i:a.get_data1()["samples"].samples){
            std::cout<<i;
        }
    

    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.cpp: In member function 'std::map<std::basic_string<char>, Spikes::data> Spikes::FileReader::get_data1()':
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.cpp:154:69: error: no matching function for call to 'Spikes::data::data(<brace-enclosed initializer list>)'
         content.emplace(std::make_pair("samples", Spikes::data{samples,0}));
                                                                         ^
    In file included from /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.cpp:3:0:
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data()
         struct data {
                ^
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 0 arguments, 2 provided
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data(const Spikes::data&)
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 1 argument, 2 provided
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data(Spikes::data&&)
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 1 argument, 2 provided
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.cpp:155:79: error: no matching function for call to 'Spikes::data::data(<brace-enclosed initializer list>)'
         content.emplace(std::make_pair("sample_names", Spikes::data{sample_names,1}));
                                                                                   ^
    In file included from /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.cpp:3:0:
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data()
         struct data {
                ^
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 0 arguments, 2 provided
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data(const Spikes::data&)
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 1 argument, 2 provided
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note: candidate: Spikes::data::data(Spikes::data&&)
    /cygdrive/c/Users/aksha/Box Sync/MyDrive/Projects/Akshay-GitHub/libSpikes/libSpikes/src/Core/FileReader.h:13:12: note:   candidate expects 1 argument, 2 provided
    

    我甚至尝试过:

    content["samples"] = Spikes::data{samples,0};
    content["sample_names"] = Spikes::data{sample_names,1};
    

    我还是会犯同样的错误。任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dean Seo    7 年前

    如中所示 https://stackoverflow.com/a/44884240/3782963 .我创建了一个返回类型为std::map get\u data1()的方法。

    施工人员 对于 data

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

    @SamVarshavchik很好地描述了原因。

    // Constructors
    data(std::vector<Eigen::MatrixXd> && rhs, int idx) 
    {
        samples = std::move(rhs);
        index = idx;
    }
    
    data(std::vector<std::string> && rhs, int idx) 
    {
        samples = std::move(rhs);
        index = idx;
    }
    
    content.emplace(std::make_pair("samples", Spikes::data{ std::move(samples), 0}));
    content.emplace(std::make_pair("sample_names", Spikes::data{ std::move(sample_names), 1}));
    
        2
  •  1
  •   Sam Varshavchik    7 年前

    当您对简单结构/聚合等使用值初始化时:

    Spikes::data{samples,0}
    

    你的 data 类包含三个成员,前两个是向量,第三个是 int std::vector 属于 std::string s使用普通整数 0 不会去任何地方。这 0 将被解释为初始化 struct ,因为它是初始化列表中的第二个值。您的第二个成员 是一个 属于 s、 编译器将尝试相应地初始化第二个成员,如下所示:

    std::vector<std::string> sample_names{0};
    

    在使用值初始化时,不能任意跳过类成员。您必须按顺序初始化每个类成员。在这种情况下,您可能的意图可能是以下几点:

    Spikes::data{samples,{},0}
    

    因此,使用空的子初始化列表初始化第二个向量。同样,您的第二次初始化尝试:

    Spikes::data{sample_names,1}
    

    Spikes::data{{}, sample_names,1}}
    

    i、 e.初始化第一个 标准::矢量 初始化列表为空的成员,然后初始化第二个 照着