'void std::vector<_Ty>::push_back(_Ty &&)' : cannot convert parameter 1 from 'const
std::vector<_Ty>' to 'std::string &&'
1> with
1> [
1> _Ty=std::string
1> ]
1> Reason: cannot convert from 'const std::vector<_Ty>' to 'std::string'
1> with
1> [
1> _Ty=std::string
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
我的私有(private)样子是这样的:
private:
map<string, vector<string> > mymap;
};
并且该函数发生的错误如下所示:
void MiniSearch::NotFunction(const string q1, const string q2, vector<string>& ReturnVec) const
{
// checks for q1 and that q2 isnt in
if (mymap.find(q1) != mymap.end() && mymap.find(q2) == mymap.end())
{
// q1 in map q2 not in map else return
const vector<string>& temp = mymap.find(q1)->second;
unsigned int i = 0;
for (std::vector<string>::const_iterator it = temp.begin(); it != temp.end(); ++it)
{
if (ReturnVec.empty())
ReturnVec.push_back(*it);
else
if (i < ReturnVec.size() && ReturnVec[i] != *it)
ReturnVec.push_back(*it);
++i;;
}
}
ReturnVec.push_back(mymap.find(q1)->second); // ERROR
}
我该如何解决?我的 map 使用的数据结构不正确吗?我是否私下想念东西?我逻辑上编写代码的方式使我无法确定为什么它不起作用。
最佳答案
在这种情况下,您不需要push_back
,因为您试图将一个 vector 附加到另一个 vector 上。相反,您需要这样的东西:
ReturnVec.insert(ReturnVec.end(), mymap.find(q1)->second.begin(), mymap.find(q1)->second.end());
还要注意,所有对
mymap.find(q1)
和mymap.find(q2)
的调用都将重新搜索 map ,从而增加了无数的周期。您应该考虑声明一个迭代器,并且每个迭代器仅执行一次find
:auto q1_it = mymap.find(q1);
auto q2_it = mymap.find(q2);
或者,如果您不能执行C++ 11:
map< string, vector<string> >::iterator q1_it = mymap.find(q1);
map< string, vector<string> >::iterator q2_it = mymap.find(q2);
那应该给您明显的性能提升。
将这些迭代器应用于我在上面的答案:
ReturnVec.insert(ReturnVec.end(), q1_it->second.begin(), q1_it->second.end());
关于c++ - 不断收到有关类型匹配的错误。不知道这意味着什么或如何解决,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20436015/