gpt4 book ai didi

c++ - 在映射键的 vector 中查找多个字符串

转载 作者:行者123 更新时间:2023-11-27 23:55:35 25 4
gpt4 key购买 nike

我有一个键和值列表。还有另一个 vector 有一些键。我想在列表中搜索这些键并使用相应的值进行进一步计算。

#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 语句,但编译器不会在此行中抛出任何错误。问题在于在 map 上使用 .find() 。它抛出一个错误:没有匹配的成员函数来调用查找。

如何在该 map 中搜索键?甚至 mymap.count(someVec(i))>0 也显示错误。

最佳答案

I was not sure if map[keys] = vals would work as this looks more like an R statement but the compiler does not throw any error in this line.

我不确定为什么会编译,但它肯定不会按照您的预期进行; std::map是一个 C++ 类,不遵守 R 的向量化语义。它有一个 few different constructors这可能用于用数据填充它,但在您的情况下,最简单的方法可能是循环输入并迭代填充它。

The issue is with using the .find() on the map. It throws an error : No matching member function for call to 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

*/

或者,Rcpp wrap/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]);
// ...
}

// ...
}

关于c++ - 在映射键的 vector 中查找多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42811062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com