tommyyu 发表于 2023-2-15 20:43:46

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

vector<string> split(string x, char fenge = ' ') {
        vector<string> ans;
       
        for(int i=0; i<x.length(); ++i) {
                if(i == 0 || char(x) == fenge) {
                        ans.push_back(string());
                        if(ans.size() > 1 && ans == string()) {
                                ans.erase(ans.size()-2);
                        }
                }
                else {
                        if('a' <= x <= 'z' || 'A' <= x <= 'Z') {
                                int s = ans.size()-1;
                                ans.insert(s, x);
                        }
                }
        }
       
        return s;
}上面是我写的一个分割string类型的函数,但是在编译时报错,请问是怎么回事
错误信息: 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)'

dolly_yos2 发表于 2023-2-15 20:52:31

字面原因,这个方法没有接受两个 std::vector<std::basic_string<char> >::size_type (大概是某种无符号整数)参数的重载
https://en.cppreference.com/w/cpp/container/vector/erase

tommyyu 发表于 2023-2-15 20:54:37

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

那具体该怎么解决呢(这个网站的内容有点看不懂{:10_269:})

dolly_yos2 发表于 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 方法直接移除最后一个元素

人造人 发表于 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]
查看完整版本: 请问是什么原因导致的编译错误,该如何修改