鱼C论坛

 找回密码
 立即注册
查看: 2689|回复: 4

[已解决]请问是什么原因导致的编译错误,该如何修改

[复制链接]
发表于 2023-2-15 20:43:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. vector<string> split(string x, char fenge = ' ') {
  2.         vector<string> ans;
  3.        
  4.         for(int i=0; i<x.length(); ++i) {
  5.                 if(i == 0 || char(x[i]) == fenge) {
  6.                         ans.push_back(string());
  7.                         if(ans.size() > 1 && ans[ans.size()-2] == string()) {
  8.                                 ans.erase(ans.size()-2);
  9.                         }
  10.                 }
  11.                 else {
  12.                         if('a' <= x[i] <= 'z' || 'A' <= x[i] <= 'Z') {
  13.                                 int s = ans.size()-1;
  14.                                 ans[s].insert(s, x[i]);
  15.                         }
  16.                 }
  17.         }
  18.        
  19.         return s;
  20. }
复制代码
上面是我写的一个分割string类型的函数,但是在编译时报错,请问是怎么回事
错误信息:
  1. [Error] no matching function for call to 'std::vector<std::basic_string<char> >::erase(std::vector<std::basic_string<char> >::size_type, std::vector<std::basic_string<char> >::size_type)'
复制代码
最佳答案
2023-2-15 21:03:54
tommyyu 发表于 2023-2-15 20:54
那具体该怎么解决呢(这个网站的内容有点看不懂)

各种 std::vector 的 erase 方法接受的都是迭代器,用迭代器指代位置
获取迭代器: std::vector 的 begin(cbegin/rbegin/crbegin) 或 end(cend/rend/crend) 方法
移动迭代器指向:std::next/std::prev(非就地)或 std::advance(就地)
另外 std::vector 有 pop_back 方法直接移除最后一个元素
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-2-15 20:52:31 | 显示全部楼层
字面原因,这个方法没有接受两个 std::vector<std::basic_string<char> >::size_type (大概是某种无符号整数)参数的重载
https://en.cppreference.com/w/cpp/container/vector/erase
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-15 20:54:37 | 显示全部楼层
dolly_yos2 发表于 2023-2-15 20:52
字面原因,这个方法没有接受两个 std::vector::size_type (大概是某种无符号整数)参数的重载
https://en ...

那具体该怎么解决呢(这个网站的内容有点看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-15 21:03:54 | 显示全部楼层    本楼为最佳答案   
tommyyu 发表于 2023-2-15 20:54
那具体该怎么解决呢(这个网站的内容有点看不懂)

各种 std::vector 的 erase 方法接受的都是迭代器,用迭代器指代位置
获取迭代器: std::vector 的 begin(cbegin/rbegin/crbegin) 或 end(cend/rend/crend) 方法
移动迭代器指向:std::next/std::prev(非就地)或 std::advance(就地)
另外 std::vector 有 pop_back 方法直接移除最后一个元素
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-15 21:15:31 | 显示全部楼层
  1. sh-5.1$ cat main.cpp
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <algorithm>

  6. std::vector<std::string> split(const std::string &str, char sep) {
  7.     std::vector<std::string> result;
  8.     std::string::const_iterator b = str.begin();
  9.     while(1) {
  10.         std::string::const_iterator e = std::find(b, str.end(), sep);
  11.         result.push_back(std::string(b, e));
  12.         if(e == str.end()) break;
  13.         b = e + 1;
  14.     }
  15.     return result;
  16. }

  17. std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
  18.     bool flag = false;
  19.     for(const auto &i: v) {
  20.         if(flag) os << std::endl;
  21.         flag = true;
  22.         os << i;
  23.     }
  24.     return os;
  25. }

  26. int main() {
  27.     {
  28.         std::vector<std::string> v = split("12345", '.');
  29.         std::cout << v << std::endl;
  30.     }
  31.     std::cout << "**************************" << std::endl;
  32.     std::cout << split(".12345", '.') << std::endl;
  33.     std::cout << "**************************" << std::endl;
  34.     std::cout << split("12.345", '.') << std::endl;
  35.     std::cout << "**************************" << std::endl;
  36.     std::cout << split("12345.", '.') << std::endl;
  37.     std::cout << "**************************" << std::endl;
  38.     std::cout << split(".1.23.45.", '.') << std::endl;
  39.     return 0;
  40. }
  41. sh-5.1$ ./main
  42. 12345
  43. **************************

  44. 12345
  45. **************************
  46. 12
  47. 345
  48. **************************
  49. 12345

  50. **************************

  51. 1
  52. 23
  53. 45

  54. sh-5.1$
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
tommyyu + 5 + 5 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 01:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表