如何解决无法在 C++ vector<pair<>> 中调用 erase() 操作
我无法在 erase
中调用 std::vector
操作。我不知道出了什么问题,我一直在努力纠正它。我无法理解错误究竟是什么。在 Internet 上的教程中,erase
操作似乎有效,但在这里并非如此。我在下面发布了我的代码和相关错误。
#include <algorithm>
#include <iostream>
#include <vector>
using std::vector;
using std::endl;
using std::pair;
bool ascSort(const pair<long long,long long> &a,const pair<long long,long long> &b) {
return a.second < b.second;
}
vector<long long> optimal_points(vector<pair<long long,long long>> &segments) {
vector<long long> points;
long long n = segments.size();
long long count = 0;
while(n!=0) {
vector<long long>::iterator it1 = segments.begin();
long long firstNum = segments[0].second;
for (long long i=1; i<n; i++) {
if ((firstNum <= segments[i].second) && (firstNum >= segments[i].first)) {
std::cout<<"YAYY"<<endl;
}
else {
points.push_back(firstNum);
segments.erase(it1,it1 + (i-1));
break;
}
}
count = count + 1;
}
std::cout<<count<<endl;
return points;
}
int main() {
long long n;
std::cin >> n;
vector<long long> first;
vector<long long> second;
for (long long i=0; i<n; i++)
std::cin>>first[i]>>second[i];
vector <pair<long long,long long>> segments;
for (long long i=0; i<n; i++)
segments.push_back({first[i],second[i]});
std::sort(segments.begin(),segments.end(),ascSort);
vector<long long> points = optimal_points(segments);
std::cout << points.size() << "\n";
for (size_t i = 0; i < points.size(); ++i) {
std::cout << points[i] << " ";
}
}
我的错误是:
covering_segments.cpp: In function 'std::vector<long long int> optimal_points(std::vector<std::pair<long long int,long long int> >&)':
covering_segments.cpp:20:53: error: conversion from '__normal_iterator<std::pair<long long int,long long int>*,vector<std::pair<long long int,long long int>>>' to non-scalar type '__normal_iterator<long long int*,vector<long long int>>' requested
vector<long long>::iterator it1 = segments.begin();
~~~~~~~~~~~~~~^~
covering_segments.cpp:28:40: error: no matching function for call to 'std::vector<std::pair<long long int,long long int> >::erase(std::vector<long long int>::iterator&,__gnu_cxx::__normal_iterator<long long int*,std::vector<long long int> >)'
segments.erase(it1,it1 + (i-1));
我应该如何解决这个问题?
解决方法
在这个语法中:
vector<long long>::iterator it1 = segments.begin();
添加一个简单的 auto
会将类型推导出为 std::vector<std::pair<long long,long long>>::iterator
(与 begin
函数完全一样)——因此两者匹配。
您遇到的第二个问题 erase()
也将得到解决,编译器之前检测到您的代码中存在错误,因为没有支持 vector<long long>::iterator
类型作为可接受参数的重载函数 – 全部更改类型后立即修复了错误。这是live 无错误编译示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。