以下代码计算排序数组有什么问题

时间:2014-09-01 11:46:45

标签: c++ sorting

为什么不返回任何值? 为什么不给我排序的号码列表呢? 我正在输入一个字符串数字,以及排序数字的输出,但是再次输入字符串。

#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;
    }
};

3 个答案:

答案 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应用于它)。