不断收到有关类型匹配的错误.不确定这意味着什么或如何解决它

Keep getting an error about type match. Not sure what it means or how to fix it

本文关键字:什么 意味着 何解决 解决 不确定 类型 错误      更新时间:2023-10-16
'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:
    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
}

我该如何解决这个问题?我的地图没有使用正确的数据结构吗?我私下里错过了什么吗?我编写代码的方式合乎逻辑,因为对我来说只是不确定为什么它不起作用。

在这种情况下,您不希望push_back,因为您正在尝试将一个向量附加到另一个向量。 相反,你想要这样的东西:

ReturnVec.insert(ReturnVec.end(), mymap.find(q1)->second.begin(), mymap.find(q1)->second.end());

另请注意,所有这些对mymap.find(q1)mymap.find(q2)的调用都将重新搜索地图,从而增加大量的周期。 您应该考虑声明一个迭代器,并且只对每个迭代器执行一次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());