请问是什么原因导致的编译错误,该如何修改
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)' 字面原因,这个方法没有接受两个 std::vector<std::basic_string<char> >::size_type (大概是某种无符号整数)参数的重载
https://en.cppreference.com/w/cpp/container/vector/erase dolly_yos2 发表于 2023-2-15 20:52
字面原因,这个方法没有接受两个 std::vector::size_type (大概是某种无符号整数)参数的重载
https://en ...
那具体该怎么解决呢(这个网站的内容有点看不懂{:10_269:}) 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 方法直接移除最后一个元素 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]