首页 > 解决方案 > 无法在 C++ 向量中调用擦除()操作>

问题描述

我无法erasestd::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));

我应该如何纠正这个问题?

标签: c++vector

解决方案


在这种语法中:

vector<long long>::iterator it1 = segments.begin();

把一个简单auto的类型推断为std::vector<std::pair<long long, long long>>::iterator(与该函数完全相同begin) - 所以两者都匹配。

您遇到的第二个问题也erase()将得到修复,编译器之前在您的代码中检测到错误,因为没有支持vector<long long>::iterator类型作为可接受参数的重载函数——所有错误都在更改类型后得到修复。这是没有错误的编译的实时示例。


推荐阅读