无法在 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 无错误编译示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...