c++ - 无法在 C++ 向量中调用擦除()操作>
问题描述
我无法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
类型作为可接受参数的重载函数——所有错误都在更改类型后得到修复。这是没有错误的编译的实时示例。
推荐阅读
- reactjs - 为什么我不能在我的 React 应用程序中安装 BUILD 文件夹?
- continuous-integration - Github 操作停留在“正在启动工作流运行”
- python - Google Vertex AI AutoML - 无法为 CSV 数据集指定架构
- javascript - 检测 JavaScript 何时重新打开?
- android - 什么是 MediaCodecInfo.CodecProfileLevel?那有什么用
- loops - Ansible 循环一个列表超过 2 个列表
- angular - 角垫底板和垫滑块不工作
- python - 如何在一个脚本中编写多个 MFRC522 标签?
- docker - NVIDIA Docker CUDA>=11.0 没有用于 Ampere GPU 上的内核分析的 NSight 计算 Cli
- javascript - 如果用户未登录,如何在前端触发按钮