#include<bits/stdc++.h> using namespace std; int main(){ string s; getline(cin,s); stringstream ss(s); string str; vector<string> nums; while(getline(ss,str,',')){ nums.push_back(str); } int m; cin>>m; vector<int>line; vector<vector<int> >lines; string strr; int len=nums.size(); for(int i=0;i<len;i++){ line.clear(); stringstream ss2(nums[i]); while(getline(ss2,strr,'-')){ line.push_back(stoi(strr)); } lines.push_back(line); } sort(lines.begin(),lines.end(),[](const vector<int>& a,const vector<int>& b){return a[0]<b[0];}); int l,r; string ans1,ans2; for(auto line:lines){ if(line.size()==1){ if(line[0]==m){ nums.erase(remove(nums.begin(),nums.end(),to_string(line[0])),nums.end()); } else if(line.size()==2){ l=line[0]; r=line[1]; if(l<m&&m<r){ ans1=to_string(l)+'-'+to_string((m-1)); ans2=to_string((m+1))+'-'+to_string(r); if(line[0]==m-1){ ans1=to_string(l); } else if(line[1]==m+1){ ans2=to_string(r); } } } } } if(!ans1.empty())nums.push_back(ans1); if(!ans2.empty())nums.push_back(ans2); for(int i=0;i<nums.size();i++){ cout<<nums[i]; if(i!=nums.size()-1){ cout<<','; } } return 0; } 为什么输出结果nums里的数据没有排序
时间: 2024-04-16 19:28:57 浏览: 24
在给定的代码中,`nums`是一个包含字符串元素的向量。默认情况下,字符串的排序是按照字典顺序进行的,而不是数值大小。因此,如果你希望排序的结果是数值上的排序,而不仅仅是字符串排序,你需要将字符串转换为数值类型进行比较和排序。
在你的代码中,将字符串转换为整数的地方是在以下部分:
```cpp
while(getline(ss2,strr,'-')){
line.push_back(stoi(strr));
}
```
在这里,`stoi()`函数将字符串转换为整数。但是,在排序之前,你需要在比较函数中使用这些整数来进行排序。
你可以修改比较函数的lambda表达式,如下所示:
```cpp
sort(lines.begin(), lines.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
});
```
将其修改为:
```cpp
sort(lines.begin(), lines.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0] && a[1] < b[1];
});
```
这样会按照数值大小对`lines`中的子向量进行排序,从而使得输出结果在数值上有序。
相关问题
#include<bits/stdc++.h> using namespace std; string a; int main() { getline(cin,a); for(int i=0;i<=a.size();i++) { if(a[i]=='(') { while(a[i]!=')') { i++; } continue; } else { cout<<a[i]; } } }为何WA
这段代码的问题在于第7行的循环条件是 `i<=a.size()`,应该改为 `i<a.size()`,否则会多读取一次字符串 `a` 的最后一个字符,导致越界。同时,第4行应该加上判断条件 `if(i==a.size()) break;`,以防止在最后一个字符是左括号时出现无限循环的情况。修改后的代码如下:
```c++
#include<bits/stdc++.h>
using namespace std;
string a;
int main() {
getline(cin,a);
for(int i=0;i<a.size();i++) {
if(a[i]=='(') {
while(a[i]!=')') {
i++;
if(i==a.size()) break;
}
continue;
}
else {
cout<<a[i];
}
}
}
```
#include<bits/stdc++.h> using namespace std; int main(){ int a[26]; string s,s1,s2,s3; getline(cin,s1); getline(cin,s2); s = s1+s2; s3 = ""; for(int i = 0;i<s.length();i++){ if(a[s[i]] == 0) { s3 =s3+s[i]; a[s[i]] = 1; } } cout<<s3; return 0; }c++中利用这个代码将输入的两个字符串按顺序拼接的同时不出现重复字符有什么问题
这个代码有以下问题:
1. `a` 数组没有初始化,会导致数组中的元素值是不确定的,应该将其初始化为 0。
2. 在判断字符是否出现过时,应该使用字符的 ASCII 码作为数组下标,而不是字符本身。
3. 对于字符串中的空格和其他特殊字符,也会被计入,可能会导致输出结果出错。
4. 当输入的字符串中包含多个相同的字符时,只会输出一个,而不是全部输出。
修正后的代码如下所示:
```c++
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[128] = {0}; // 初始化数组
string s,s1,s2,s3;
getline(cin,s1);
getline(cin,s2);
s = s1+s2;
s3 = "";
for(int i = 0;i<s.length();i++){
if(a[int(s[i])] == 0 && isalpha(s[i])) { // 使用 ASCII 码作为数组下标,并且判断是否为字母
s3 = s3 + s[i];
a[int(s[i])] = 1;
}
}
cout<<s3;
return 0;
}
```
其中,`isalpha()` 函数用于判断字符是否为字母。