鱼C论坛

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

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

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

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

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

x
vector<string> split(string x, char fenge = ' ') {
        vector<string> ans;
        
        for(int i=0; i<x.length(); ++i) {
                if(i == 0 || char(x[i]) == fenge) {
                        ans.push_back(string());
                        if(ans.size() > 1 && ans[ans.size()-2] == string()) {
                                ans.erase(ans.size()-2);
                        }
                }
                else {
                        if('a' <= x[i] <= 'z' || 'A' <= x[i] <= 'Z') {
                                int s = ans.size()-1;
                                ans[s].insert(s, x[i]);
                        }
                }
        }
        
        return s;
}
上面是我写的一个分割string类型的函数,但是在编译时报错,请问是怎么回事
错误信息:
[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 方法直接移除最后一个元素
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那具体该怎么解决呢(这个网站的内容有点看不懂
想知道小甲鱼最近在做啥?请访问 -> 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 方法直接移除最后一个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

std::vector<std::string> split(const std::string &str, char sep) {
    std::vector<std::string> result;
    std::string::const_iterator b = str.begin();
    while(1) {
        std::string::const_iterator e = std::find(b, str.end(), sep);
        result.push_back(std::string(b, e));
        if(e == str.end()) break;
        b = e + 1;
    }
    return result;
}

std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {
    bool flag = false;
    for(const auto &i: v) {
        if(flag) os << std::endl;
        flag = true;
        os << i;
    }
    return os;
}

int main() {
    {
        std::vector<std::string> v = split("12345", '.');
        std::cout << v << std::endl;
    }
    std::cout << "**************************" << std::endl;
    std::cout << split(".12345", '.') << std::endl;
    std::cout << "**************************" << std::endl;
    std::cout << split("12.345", '.') << std::endl;
    std::cout << "**************************" << std::endl;
    std::cout << split("12345.", '.') << std::endl;
    std::cout << "**************************" << std::endl;
    std::cout << split(".1.23.45.", '.') << std::endl;
    return 0;
}
sh-5.1$ ./main
12345
**************************

12345
**************************
12
345
**************************
12345

**************************

1
23
45

sh-5.1$

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 19:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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