我有一个字符串向量,我想从vector返回一个类似于字符串的字符串。
例如,vector包含:" load"," fox"," google"," firefox"字符串是:" mozilla firefox"。此示例中的真实结果是" firefox"。
我使用下面的代码,但这是错误的并返回" fox"我的样本。
vector<string>::const_iterator it_found = find_if(MyVector.begin(), MyVector.end(), [&MyString](string s) -> bool
{ return( MyString.find(s) != string::npos ); });
if(it_found != MyVector.end())
{
//Do Somthing
}
我该怎么办?
答案 0 :(得分:3)
您将返回第一个字符串,该字符串是您的搜索字词的子字符串。您似乎想要最佳匹配,因此需要更复杂的方法。您可以计算一些得分有多好,并找到给出最高得分的元素,例如:与std::max_element
如果您以后改进匹配算法,分数可能只是匹配子字符串的长度或更复杂的东西。
答案 1 :(得分:1)
您可以使用.factory('$localstorage', ['$window', function($window) {
return {
set: function(key, value) {
$window.localStorage[key] = value;
},
remove: function(key) {
$window.localStorage.removeItem(key);
},
get: function(key, defaultValue) {
return $window.localStorage[key] || defaultValue;
},
setObject: function(key, value) {
$window.localStorage[key] = JSON.stringify(value);
},
getObject: function(key) {
return JSON.parse($window.localStorage[key] || '{}');
},
clearAll: function() {
$window.localStorage.clear();
}
}
}])
返回split
的实现在空格上拆分输入字符串。
std::vector<std::string>
然后将std::vector<std::string> split(std::string const &input) {
std::istringstream buffer(input);
std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)),
std::istream_iterator<std::string>());
return ret;
}
中的每个字符串与来自MyVector
的返回向量中的候选字段进行比较。
split
输出:
std::string MyString = "mozzilla firefox";
std::vector<std::string> MyVector = {"fire", "fox", "firefox", "mozilla"};
auto candidates = split(MyString);
auto it_found = std::find_if(MyVector.begin(), MyVector.end(), [&candidates](std::string s) -> bool{
return (std::find(candidates.begin(), candidates.end(), s) != candidates.end());
});
if(it_found != MyVector.end()){
std::cout<<"\nFound : "<<*it_found;
}
请注意,这只会找到Found : firefox
中字符串的第一个匹配项,并在MyVector
中找到一个字符串。