在地图键的矢量中查找多个字符串
Lookup multiple strings in a vector in a map's keys
我有一个键和值的列表。还有另一个向量具有一些键。我想在列表中搜索这些键,并使用相应的值进行进一步计算。
#Inside R environment
simil<-list("key"=c("A","B","C","D"),"val"=c(1.2,3.2,2.0,1.9))
someVec = c("B","D")
//CPP code
#include <RcppEigen>
#include <map>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector someFunc(GenericVector simil, CharacterVector someVec){
List sim(simil);
std::map<std::string, double> mymap;
std::map<std::string, double>::iterator it;
CharacterVector keys = sim["key"];
NumericVector vals = sim["val"];
map[keys] = vals;
for(int i=0;i<someVec.size();i++){
it = mymap.find(someVec(i));
if(it!=mymap.end()){
// some logic here
}
}
我不确定map[keys] = vals
是否可以工作,因为这看起来更像是 R 语句,但编译器不会在此行中抛出任何错误。问题在于在地图上使用 .find()。 它抛出一个错误:没有匹配的成员函数供调用查找。
如何在该地图中搜索键?甚至mymap.count(someVec(i))>0
也显示错误。
我不确定map[keys] = vals是否可以工作,因为这看起来更像是R语句,但编译器不会在此行中抛出任何错误。
我不确定为什么会编译,但它绝对不会做你期望它做的事情;std::map
是一个C++类,不遵守 R 的矢量化语义。它有几个不同的构造函数,可用于用数据填充它,但在你的情况下,最简单的方法可能是循环你的输入并迭代填充它。
问题在于在地图上使用 .find()。它抛出一个错误:没有匹配的成员函数供调用查找。
我怀疑这与CharacterVector::operator[]
返回string_proxy
(或const_string_proxy
,取决于上下文)的事实有关。这不会隐式转换为std::string
,但您可以使用Rcpp::as<std::string>
执行显式转换。
一起
#include <Rcpp.h>
#include <map>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector find_keys(List keyvals, CharacterVector morekeys) {
std::map<std::string, double> mymap;
std::map<std::string, double>::iterator it;
CharacterVector keys = keyvals["key"];
NumericVector vals = keyvals["val"];
R_xlen_t i = 0, n = keys.size(), m = morekeys.size();
NumericVector res(m, NA_REAL);
// fill map
for (; i < n; i++) {
mymap[as<std::string>(keys[i])] = vals[i];
}
// look up potential keys
for (i = 0; i < m; i++) {
it = mymap.find(as<std::string>(morekeys[i]));
if (it != mymap.end()) {
res[i] = it->second;
}
}
return res;
}
/*** R
keyvals <-list(
key = c("A","B","C","D"),
val = c(1.2,3.2,2.0,1.9)
)
morekeys = c("B", "D", "x")
find_keys(keyvals, morekeys)
# [1] 3.2 1.9 NA
*/
或者,Rcppwrap
/as
专业化知道如何"开箱即用"地处理CharacterVector
和std::vector<std::string>
之间的转换,即
// [[Rcpp::export]]
NumericVector find_keys2(List keyvals, const std::vector<std::string>& morekeys) {
// ...
std::vector<std::string> keys = as<std::vector<std::string> >(keyvals["key"]);
// ...
// fill map
for (; i < n; i++) {
mymap[keys[i]] = vals[i];
}
// look up potential keys
for (i = 0; i < m; i++) {
it = mymap.find(morekeys[i]);
// ...
}
// ...
}
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 在 c++ 中查找字符串中没有循环的数字总和
- 查找字符串可以减少到 0 的步骤数
- C++ 查找字符串中存在的元素向量
- 查找字符串中最常见的字母
- C++使用旧编译器GCC 4.4.0在结构列表中查找字符串
- 查找字符串是否包含字符串向量的任何一个元素的最佳方法
- 如何使用字符串流查找字符串中的整数总和?
- 穿过链接列表以查找字符串
- 查找字符串中存在的不同字符
- 如何使用 std::find 从向量的第一个元素中查找字符串<字符串对<字符串、字符串> >类型?
- 如何从C++的输入中查找字符串并将其替换为另一个字符串
- C++在多个字符串中查找字符串
- 使用std :: quare_range查找字符串向量中发生的前缀范围
- 在字符串列表中查找字符串,然后将字符串设置为找到的字符串?
- 尝试在类的向量中查找字符串
- 是否有一种算法可以查找字符串中任何指定字符的第一次出现
- 在.txt中查找字符串并获取C++中的行内容
- 如何在考虑标点符号的同时在文件中查找字符串