对结构进行排序
Sorting struct(ures)
如果我定义一个结构
struct dat{
int a;
char b;
};
然后我声明该结构的数组,即
dat array[10];
然后我对dat数组数组[I].a进行排序,即
std::sort((array.a),(array.a+10);
这行得通吗?
假设排序后,array[5].a转到array[2].a,array[5]。b也转到array[2]。b,如果不是如何使用std库函数sort.
std::sort()
算法对数据结构进行排序,可以提供比较器函数作为其第三个参数。
例如,按dat.a
:的值排序
bool IntSorter (const dat& dat1, const dat& dat2) { return dat1.a < dat2.a; }
然后,你这样调用排序:
std::sort(array, array + 10, IntSorter);
此外,您可以重构代码以避免出现幻数10
,也可以在引用对std::sort()
的调用中的最后一个元素时避免重复它。
不,它不会像编写的那样工作。
第一个std::sort((array.a),(array.a+10);
不正确。array.a
不是一个数组,试图将其视为一个数组肯定会导致一些问题。
您需要对数组本身(std::sort(array, array+10);
)进行排序,但同样,这不会起作用,因为您没有提供opeartor<(dat)
的重载。
你可以提供一个:
bool operator<(const dat& l, const dat& r)
{
return l.a < r.a;
}
那么std::sort(array, array+10);
将按预期工作。
当你对一个对象进行排序时,它会"一起进行"。这意味着dat::a
和dat::b
不会在特定对象内被修改,但该对象在排序数组中的位置可能在不同的索引处。
如果要根据a
:的值对结构数组进行排序
std::sort(std::begin(array), std::end(array),
[](dat const & lhs, dat const & rhs){return lhs.a < rhs.a;});
这将移动b
值及其相应的a
值,我认为这正是您所希望的。如果您希望b
值保持不变,那么它会有点混乱。C++没有提供任何将CCD_ 16的数组作为CCD_。
首先,array.a
不是一个合法的表达式,因为array
没有a
成员,事实上,它甚至不是一个结构。如果要按字段a
对dat
成员进行排序,则需要以提供定制订购功能(优选方式,特别是如果你有C++11并且可以使用lambda函数),或者在CCD_ 24上定义一个CCD_。如果你只是想移动排序期间的a
成员,将b
成员留在其所在位置是您还必须定义一个自定义的swap
函数:
void
swap( dat& lhs, dat& rhs )
{
std::swap( lhs.a, rhs.a );
}
但这会很糟糕,我建议找其他的组织数据的方式。
- 将结构向量排序为子组
- 带有枚举方向/类型的气泡排序结构数组
- C++对结构向量进行排序
- 在C++中对结构向量进行排序时出现问题
- 按字母顺序对结构内数组变量中的名称进行排序
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 使用选择排序对数组数据结构进行排序,但它不起作用
- 对结构向量进行两次排序
- C++使用QuickSort对数组结构进行排序
- 如何选择排序一些结构
- 对结构int成员进行排序
- 在排序链表中插入结构并将其写入二进制文件
- 对坐标结构的向量进行排序
- C++ 中优先级队列的结构排序条件
- 按姓氏合并排序结构,导致分段错误
- C++ 无效的比较器排序结构向量
- 排序结构的队列
- C++排序结构链表
- 包含指向下一个的指针的排序结构
- 用STL算法排序结构的动态数组