2016-07-28 3 views
-1

Я не могу понять, что вызывает ошибку в следующем коде. Вкратце, код пытается перебрать элементы списка (каждый из которых представляет собой вектор целых чисел) и упорядочить их по структуре данных карты.Ошибка с базовым вводом списка Rcpp

// [[Rcpp::export]] 
void getPathsFromList(Rcpp::List& pathsList, 
    std::unordered_map<int, std::vector<int> >& paths){ 

    Rcpp::List plist(pathsList); 
    int p=plist.size(); 
    for(int i=0;i<p; i++){ 
     SEXP e = plist[i]; 
     Rcpp::NumericVector v(e); 
     for(int j=0; j<v.size(); j++){ 
      paths[i].push_back(v[j]); 
     } 
    } 

} 

Ошибки я получаю следующее:

error: no matching constructor for initialization of 'std::__1::unordered_map<int, std::__1::vector<int, std::__1::allocator<int> >, std::__1::hash<int>, std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int, std::__1::vector<int, std::__1::allocator<int> > > > > 

Я также попытался явно назначая v[j] выше к int переменной, а затем толкает его в вектор, но не совсем помощь. Похоже, что я упускаю что-то фундаментальное, и я бы очень признателен за любую помощь. (Я на OSX Mavericks.)

+0

Пожалуйста, добавьте примеры данных, которые вы ожидаете совершить. – coatless

ответ

1

Существует, к сожалению, нет поддержки в Rcpp не работать с std:map<int, vector<int> >. Таким образом, вызов «импорта» или приведение объектов R в C++ не может быть сформирован.

Если вы хотите удалить // [[Rcpp::export]] и просто вызвать его через C++, а затем переформатировать объект в C++-вызове до Rcpp::List, тогда все будет в порядке.

Кроме того, вы должны объявить флаг C++ 11, так как unordered_map является C++ 11 специфический через:

// [[Rcpp::plugins(cpp11)]] 

например

#include <Rcpp.h> 

// [[Rcpp::plugins(cpp11)]] 

void getPathsFromList(Rcpp::List& pathsList, 
    std::unordered_map<int, std::vector<int> >& paths){ 

    Rcpp::List plist(pathsList); 
    int p=plist.size(); 
    for(int i=0;i<p; i++){ 
     SEXP e = plist[i]; 
     Rcpp::NumericVector v(e); 
     for(int j=0; j<v.size(); j++){ 
      paths[i].push_back(v[j]); 
     } 
    } 

} 
+0

Большое спасибо! – mskb