排序2dim向量并保持索引

时间:2014-04-08 22:43:48

标签: c++ arrays vector

我填写了一个2dim向量,如下所示:

vector< vector<double>> save;
for ( int i=0;i<5;i++ )
{
    for ( int j=0;j<5;j++ )
    {
        save[i][j]=i*(i+j);

    }
  }

现在我该如何排序并保留相关指数? 例如,8的索引是4和4

我已经使用这段代码来保存索引并将它们分别放在另外两个数组中,分别是2dim和1dim

void sort(int index[5][2],int order[5])
 {
     int l=0;
     while( l<5)
     {
  float max=-10000;
  int c1=0;
  int c2=0;
     for(int i=0;i<5;i++)
    {
        for(int j=i+1;j<5;j++)
        {
            if(save[i][j]>max)
            {
                max=save[i][j];
                c1=i+1;
                c2=j+1;
            }

        }
    }

    order[l]=max;
    index[l][0]=c1;
    index[l][1]=c2;



    l++;
}
 }

我想知道如果我使用向量和排序函数而不是当前解决方案,当数据的数量是100而不是5时,我可以节省更多的时间吗?

2 个答案:

答案 0 :(得分:1)

您可以使用数字哈希映射到其索引。类似的东西:

std::map< double, std::list<int> > indices;

另外,请考虑两个浮点数之间的比较是近似的事实。

答案 1 :(得分:1)

我会做这样的事情。

// Create a structure to manage co-ordinates, values, and 1d-indices.
// These are the components you're actually interested in.
struct PointValue
{
    PointValue(int x, int y, int value)
        : x(x), y(t), value(value), indexOneDimensional(x*(x+y))
    {}
    int x, y, indexOneDimensional;
    int value;
    // Sort predicate for sorting these PointValue objects.
    static bool SortFunction(const PointValue& left, const PointValue& right)
    {
        return left.value < right.value;
    }
};
typedef std::vector<PointValue> PointValueList;


int sizeX = 100; int sizeY = 100;
PointValueList myValues(sizeX * sizeY);

// Create a 100x100 array with random values for each point.
for (int i = 0; i < sizeX; i++)
{
    for (int j = 0; j < sizeY; j++)
    {
        myValues.push_back(PointValue(i, j, rand()));
    }
}

// Sort using our static predicate.
std::sort(myValues.begin(), myValues.end(), PointValue::SortFunction);

// Print 1d-indices.
std::for_each(m_values.begin(), m_values.end(), [](const PointValue& val) {
    printf("Index is: %d. Value is: %d", val.indexOneDimensional, val.value);
});