C++ 对2dim向量进行排序并保留索引
我填充了一个2dim向量,如下所示:C++ 对2dim向量进行排序并保留索引,c++,arrays,vector,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); } } vectorsave; 对于(int i=0;i,您可以使用数字到其索引的哈希映射。类似于: std::map< double, std::list<in
vector< vector<double>> save;
for ( int i=0;i<5;i++ )
{
for ( int j=0;j<5;j++ )
{
save[i][j]=i*(i+j);
}
}
vectorsave;
对于(int i=0;i,您可以使用数字到其索引的哈希映射。类似于:
std::map< double, std::list<int> > indices;
std::map索引;
另外,考虑到两个浮点数之间的比较是近似的这一事实。我会这样做
// 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);
});
//创建一个结构来管理坐标、值和1d索引。
//这些是您真正感兴趣的组件。
结构点值
{
点值(整数x,整数y,整数值)
:x(x),y(t),值(value),指数(x*(x+y))
{}
int x,y,指数内维度;
int值;
//排序谓词,用于对这些PointValue对象进行排序。
静态布尔排序函数(常量PointValue和左、常量PointValue和右)
{
返回left.value
例如,8的索引是4和4。你是什么意思?你想为以前的值存储两组数据吗?@Aesthete:我的意思是,例如这里save[1][1]=2,我想在排序后保留i和j的值,它们是1和1(它们属于2)
// 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);
});