在字符串字段中查找字符串的索引
Finding the index of a string inside a field of strings
对于一个非常基本的问题,我深表歉意,我是 Rcpp 和 C++ 的新手。
我有一个字段 (arma::field
),我已将其初始化为保存字符串 (arma::field<std::string> my_vector
)。我还有一个字符串 std::string id
位于字符串字段内的某个位置,我想找到它所在的位置。我习惯于使用类似于以下的向量和数字来执行此操作:
arma::vec fun(arma::vec input_vector){
// Find where vector equals 5 (for example)
uvec index = arma::find(input_vector == 5);
return index;
}
我最初尝试做完全相同的事情,但给了一个字符串而不是数字来比较:
arma::uvec fun(arma::vec input_vector, std::string id){
// Find where vector string id
uvec index = arma::find(input_vector == id);
return index;
}
这returns一个错误
error: invalid operands to binary expression ('arma::vec' (aka 'Col<double>')
and 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
这是有道理的,因为向量未初始化为包含字符串。虽然我不认为向量可以初始化为包含字符串,因为当我尝试 arma::vec<std::string>
时,它给出了一堆错误。
这让我找到了可以容纳更多种类变量的字段。
arma::uvec fun(arma::field<std::string> input_field, std::string id){
// Find where vector equals 5 (for example)
uvec index = arma::find(input_field == id);
return index;
}
然而这returns
error: invalid operands to binary expression ('arma::field<std::string>' and
'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
我也试过strcmp
,同样报错
error: no viable conversion from 'arma::field<std::string>' to 'const char *'
这让我想问,如何找到字段中字符串的位置?
我愿意将类型更改为效果更好的类型,我怀疑使用 std::vector
可能效果更好,或者可能是我从未听说过的另一种类型。然而,我的第一个实验并不是很成功。如果有人对前进方向有任何提示,将不胜感激。
编辑: 澄清 find
是 arma::find
而不是 std::find
,因为它非常不清楚。
arma
不支持根据 Matrix types
在其数据结构中存储 std::string
The root matrix class is Mat, where type is one of:
- float, double, std::complex, std::complex, short, int, long, and unsigned versions of short, int, long
反过来,Rcpp
不支持将 std::vector<std::string>
导入或导出到 armadillo
。因此,错误。
在这种情况下查找字符串的最简单方法是遍历向量并检查每个元素。或者,制作一张地图,看看钥匙是否在地图内。
循环字符串检查方法:
#include <Rcpp.h>
// [[Rcpp::export]]
std::vector<int> find_string_locs(std::vector<std::string> input_vector, std::string id)
{
std::vector<int> id_locs; // Setup storage for found IDs
for(int i =0; i < input_vector.size(); i++) // Loop through input
if(input_vector[i] == id) // check if input matches target
id_locs.push_back(i);
return id_locs; // send locations to R (c++ index shift!)
}
/***R
input_vector = c("stat","toad","stat","rcpp")
id = "stat"
find_string_locs(input_vector,id)
*/
然后输出是:
[1] 0 2
注意 C++ 索引移位...从 0 开始,而不是像 R 中那样从 1 开始。
除此之外,Coatless 说,我不确定,你了解 C++ 中 vector 的使用。在 C++ 中,向量只是一个可调整大小的列表。
关于代数向量,它有大小(大小),但实际上没有方向。也就是说,它不是代数意义上的向量。
如果您想在 std::vector 中搜索字符串,您可以这样做:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int get_str_position(const std::string& str_to_find, const std::vector<std::string>& vector_to_search)
{
std::vector<std::string>::const_iterator it = std::find(vector_to_search.begin(), vector_to_search.end(), str_to_find);
if (it == vector_to_search.end()) {
return -1;
}
else {
return it - vector_to_search.begin();
}
};
void find_str(const std::string& str_to_find, const std::vector<std::string>& vector_to_search)
{
int position = get_str_position(str_to_find, vector_to_search);
if (position == -1) {
std::cout << "Could not find string: '" << str_to_find << "'" << std::endl;
}
else {
std::cout << "Found string '" << str_to_find << "' at position " << position << std::endl;
}
};
int main()
{
std::vector<std::string> vec = { "one", "two", "three" };
std::string existent_str = "two";
std::string non_existent_str = "four";
find_str(existent_str, vec);
find_str(non_existent_str, vec);
return 0;
}
Returns:
Found string 'two' at position 1
Could not find string: 'four'
此外,在你的函数 'fun' 中,你说:
arma::uvec fun(arma::field<std::string> input_field, std::string id){
// Find where vector equals 5 (for example)
uvec index = find(input_field == id);
return index;
}
如果您使用 std::find,您将只搜索 'input_field' 值 0 或 1,因为您将布尔表达式作为参数传递给 find...
// Not sure how this works at all
// You should not be able to compare a string to a std::vector<std::string>
bool true_or_false = (input_field == id);
// Find 0 (false) or 1 (true)
uvec index = find(true_or_false);
对于一个非常基本的问题,我深表歉意,我是 Rcpp 和 C++ 的新手。
我有一个字段 (arma::field
),我已将其初始化为保存字符串 (arma::field<std::string> my_vector
)。我还有一个字符串 std::string id
位于字符串字段内的某个位置,我想找到它所在的位置。我习惯于使用类似于以下的向量和数字来执行此操作:
arma::vec fun(arma::vec input_vector){
// Find where vector equals 5 (for example)
uvec index = arma::find(input_vector == 5);
return index;
}
我最初尝试做完全相同的事情,但给了一个字符串而不是数字来比较:
arma::uvec fun(arma::vec input_vector, std::string id){
// Find where vector string id
uvec index = arma::find(input_vector == id);
return index;
}
这returns一个错误
error: invalid operands to binary expression ('arma::vec' (aka 'Col<double>')
and 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
这是有道理的,因为向量未初始化为包含字符串。虽然我不认为向量可以初始化为包含字符串,因为当我尝试 arma::vec<std::string>
时,它给出了一堆错误。
这让我找到了可以容纳更多种类变量的字段。
arma::uvec fun(arma::field<std::string> input_field, std::string id){
// Find where vector equals 5 (for example)
uvec index = arma::find(input_field == id);
return index;
}
然而这returns
error: invalid operands to binary expression ('arma::field<std::string>' and
'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
我也试过strcmp
,同样报错
error: no viable conversion from 'arma::field<std::string>' to 'const char *'
这让我想问,如何找到字段中字符串的位置?
我愿意将类型更改为效果更好的类型,我怀疑使用 std::vector
可能效果更好,或者可能是我从未听说过的另一种类型。然而,我的第一个实验并不是很成功。如果有人对前进方向有任何提示,将不胜感激。
编辑: 澄清 find
是 arma::find
而不是 std::find
,因为它非常不清楚。
arma
不支持根据 Matrix types
std::string
The root matrix class is Mat, where type is one of:
- float, double, std::complex, std::complex, short, int, long, and unsigned versions of short, int, long
反过来,Rcpp
不支持将 std::vector<std::string>
导入或导出到 armadillo
。因此,错误。
在这种情况下查找字符串的最简单方法是遍历向量并检查每个元素。或者,制作一张地图,看看钥匙是否在地图内。
循环字符串检查方法:
#include <Rcpp.h>
// [[Rcpp::export]]
std::vector<int> find_string_locs(std::vector<std::string> input_vector, std::string id)
{
std::vector<int> id_locs; // Setup storage for found IDs
for(int i =0; i < input_vector.size(); i++) // Loop through input
if(input_vector[i] == id) // check if input matches target
id_locs.push_back(i);
return id_locs; // send locations to R (c++ index shift!)
}
/***R
input_vector = c("stat","toad","stat","rcpp")
id = "stat"
find_string_locs(input_vector,id)
*/
然后输出是:
[1] 0 2
注意 C++ 索引移位...从 0 开始,而不是像 R 中那样从 1 开始。
除此之外,Coatless 说,我不确定,你了解 C++ 中 vector 的使用。在 C++ 中,向量只是一个可调整大小的列表。
关于代数向量,它有大小(大小),但实际上没有方向。也就是说,它不是代数意义上的向量。
如果您想在 std::vector 中搜索字符串,您可以这样做:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
int get_str_position(const std::string& str_to_find, const std::vector<std::string>& vector_to_search)
{
std::vector<std::string>::const_iterator it = std::find(vector_to_search.begin(), vector_to_search.end(), str_to_find);
if (it == vector_to_search.end()) {
return -1;
}
else {
return it - vector_to_search.begin();
}
};
void find_str(const std::string& str_to_find, const std::vector<std::string>& vector_to_search)
{
int position = get_str_position(str_to_find, vector_to_search);
if (position == -1) {
std::cout << "Could not find string: '" << str_to_find << "'" << std::endl;
}
else {
std::cout << "Found string '" << str_to_find << "' at position " << position << std::endl;
}
};
int main()
{
std::vector<std::string> vec = { "one", "two", "three" };
std::string existent_str = "two";
std::string non_existent_str = "four";
find_str(existent_str, vec);
find_str(non_existent_str, vec);
return 0;
}
Returns:
Found string 'two' at position 1
Could not find string: 'four'
此外,在你的函数 'fun' 中,你说:
arma::uvec fun(arma::field<std::string> input_field, std::string id){
// Find where vector equals 5 (for example)
uvec index = find(input_field == id);
return index;
}
如果您使用 std::find,您将只搜索 'input_field' 值 0 或 1,因为您将布尔表达式作为参数传递给 find...
// Not sure how this works at all
// You should not be able to compare a string to a std::vector<std::string>
bool true_or_false = (input_field == id);
// Find 0 (false) or 1 (true)
uvec index = find(true_or_false);