调用std::find处理pair类型向量时出现no viable overloaded '='报错如何解决
问题原因
报错的核心是迭代器类型不匹配:
iso是元素为std::pair<int, int>的向量,std::find遍历iso返回的迭代器类型为std::vector<std::pair<int, int>>::iterator- 代码中错误将接收返回值的
it声明为vector<int>::iterator,两种迭代器属于完全不兼容的类型,无法互相赋值,因此编译器抛出类型转换失败的赋值运算符重载报错。
修复方案
方案1:手动修正迭代器声明
将it的声明修改为和iso元素类型匹配的迭代器:
std::vector<std::pair<int, int>>::iterator it; it = std::find(iso.begin(), iso.end(), vec[i]);
方案2:使用auto自动推导类型(C++11及以上版本适用)
无需手动编写冗长的迭代器类型,让编译器自动匹配std::find返回的迭代器类型,写法更简洁不易出错:
auto it = std::find(iso.begin(), iso.end(), vec[i]);
优化建议
当前代码对同一个vec[i]调用了两次std::find,会产生两次冗余遍历,可以调整为仅调用一次查找复用结果,提升执行效率:
std::vector<std::pair<int, int>> nodat; std::vector<std::pair<int, int>> unknown; std::vector<std::pair<int, int>> measure; for(int i = 0; i < vec.size(); i++){ auto it = std::find(iso.begin(), iso.end(), vec[i]); if(it == iso.end()){ nodat.push_back(vec[i]); } else{ int index = std::distance(iso.begin(), it); if(HalfLife[index] == 1e-50){ unknown.push_back(vec[i]); } else if(HalfLife[index] > 1e-8){ measure.push_back(vec[i]); } } }
内容的提问来源于stack exchange,提问作者Zachary Finger
相关产品推荐
相关产品推荐

