为什么不返回任何值? 为什么不给我排序的号码列表呢? 我正在输入一个字符串数字,以及排序数字的输出,但是再次输入字符串。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class SequenceOfNumbers {
public:
vector<string> rearrange(vector<string> sequence) {
int i;
int size = sizeof(sequence);
vector<int> s1;
for (i = 0; i < size; i++) {
s1[i] = stoi(sequence[i]);
}
sort(s1.begin(), s1.end());
for (i = 0; i < size; i++) {
sequence[i] = to_string(s1[i]);
}
return sequence;
}
};
答案 0 :(得分:2)
int size=sizeof(sequence);
你可能意味着
int size=sequence.size();
实际上返回std :: vector容器中的元素数。
vector <int> s1;
for(i=0;i<size;i++)
{
s1[i]=stoi(sequence[i]);
}
这里的问题是向量s1被初始化为空,因此你不能改变第i个值(因为它不存在)。直接给std :: vector正确的大小。
vector <int> s1(size);
for(i=0;i<size;i++)
{
s1[i]=stoi(sequence[i]);
}
答案 1 :(得分:1)
这是一个问题:
int size = sizeof(sequence);
这会给你vector<int>
类的大小;不是此向量对象中的元素数。你想要:
size_t size = sequence.size();
这是另一个问题:
s1[i]=stoi(sequence[i]);
s1
为空,因此s1[i]
无效。相反,您必须:
vector<int> s1(size);
或push_back
来增长向量s1.push_back(stoi(sequence(i));
如果您使用的是push_back
,您可能希望首先执行s1.reserve(size)
以避免不必要的内存分配。
答案 2 :(得分:0)
一个优雅的解决方案是:
vector<string> rearrange(const vector<string>& sequence)
{
vector<string> result = sequence;
std::sort(result.begin(), result.end(), [](string& lhs, string& rhs)
{
return (std::stoi(lhs) < std::stoi(rhs));
});
return result;
}
如您所见,此解决方案依赖于std :: sort。两个第一个参数是向量的开始和结束迭代器。第三个参数必须是用于确定排序顺序(升序或降序)的比较器。这里我使用了lambda函数,但它可能是一个函子。
return (std::stoi(lhs) < std::stoi(rhs));
在这里,您将左侧操作数(也称为lhs)与右侧操作数(又名rhs)进行比较。
您可以使用仿函数代替lambda表达式,该仿函数基本上是一个实现的类:
bool operator()(const string& lhs, const string& rhs).
根据矢量的大小,您可能希望避免复制输入矢量,而是直接对该矢量进行就地排序(删除'sequence'的常量并将std :: sort应用于它)。