
#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
bool compare_two_vectors ( pair<string, double> a, pair<string, double> b ) {
return ( asecond > bsecond );
}
int main () {
vector< pair<string, double> > student (2, make_pair( "Unknown", 00));
vector< pair<string, double> >::iterator it = studentbegin();
student[1]first = "Jackson Bug";
student[1]second = 880;
studentpush_back( make_pair("Yu Yeeson", 1000) );
studentpush_back( make_pair("Shen Miranda", 850) );
studentpush_back( make_pair("Chen Jamie", 790) );
cout << "input order:\n";
for ( vector< pair<string, double> >::iterator it = studentbegin(); it != studentend(); it++ ) {
cout << '\t' << it->first << endl;
cout << '\t' << it->second << endl;
} cout << "\n\n";
sort(studentbegin(), studentend(), compare_two_vectors );
cout << "sorted order:\n";
for ( vector< pair<string, double> >::iterator it = studentbegin(); it != studentend(); it++ ) {
cout << '\t' << it->first << endl;
cout << '\t' << it->second << endl;
} cout << "\n\n";
return 0;
}
越界是因为这行代码:
gdListremove(i);
不用迭代器 Iterator 遍历数组时,不可以在 i++ 循环里面对数组进行增、删 *** 作,否则会导致最后发生异常。(如越界,在本例中)
如果想遍历并实时删除里面的数据,请考虑如下方式:
Iterator<Integer> it = getDel()iterator();
while (ithasNext()) {
Integer i = itnext();
if(你的判断代码)
itremove();
}
这个可不是老师故意为难的,而是作为IT一员所必须理解的
对于编译器来说,"[]"是个优先级很高的单目运算符,它是这样解析这运算符的:
array[m1][m2][m3][m4][mn]=(((((array+m1))+m2)+m3)+m4)++mn);(n>=1)
这里来讨论简单点的咯,就取n=2时吧,此时有: array[m1][m2]=((array+m1)+m2);
要透彻理解这表达式,得先弄清楚指针的加法是怎样的
指针p=指针q+n(n为整数,p,q为同类型指针),意思即:指针p指向了指针q所指向内存处的后nq所指向的单位的大小
举个例子吧:
int array[4][6];
array是个二维数组,由4个一维数组array[0],array[1],array[2],array[3]组成array也是个二维常量指针,它指向array[0]所以,对于(array+2)这个指针,它是指向array所指向内存地址处的后(2sizeof(array[0])),即(12sizeof(int))个字节处(即array+2指向array[2]) 而array[2]这个一维指针则指向array[2][0]
而(array)(即array[0])便为一维指针了,它指向array[0][0],所以,对于((array+2)+3)这个指针,由于array+2指向array[2],所以(array+2)指向array[2][0]所以((array+2)+3)便是指向((array+2))所指向内存处的后(3sizeof(array[2][0])),即(3sizeof(int))个字节处(即((array+2)+3)指向array[2][3])
所以,便有了array[2][3]=((array+2)+3) 2代表指针要后移2sizeof(array[0])个字节,3代表指针要移动3sizeof(array[2][0])个字节所以,指针一共要移动多少也就清楚了
因为不知道你学得怎样,所以讲的有些啰嗦呃,但尽量清楚些
再举个典型例子:
int array[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d\n", array[1][7]);
这该输出多少呢还是越界错误
解答:array[1][7]被编译器解析为:((array+1)+7),后移的总字节为1sizeof(array[1])+7sizeof(array[1][0]),即11sizeof(int) 而该数组大小为12sizeof(int),array指针是可以后移11sizeof(int)个字节的,所以不会越界所以,((array+1)+7)这个指针指向了该数组第12个单位(第一个单位为a[0][0]),即array[2][3],即12,所以程序输出12
也可以这样快速看出array[1][7]值为什么:arra[1]指向array[1][0],是数组的第5个元素7表示让array[1]这个指针再后移7个单位所以array[1][7]便是该数组的第12个单位也即array[2][3]了所以输出12
list集合的遍历3种方法:
[java] view plaincopy
package comsort;
import javautilArrayList;
import javautilIterator;
import javautilList;
/
list的三种遍历
@author Owner
/
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
listadd("a");
listadd("b");
listadd("c");
listadd("c");//可添加重复数据
//遍历方法一
for(Iterator<String> iterator = listiterator();iteratorhasNext();){
String value = iteratornext();
Systemoutprintln(value);
}
//遍历方法二
for(String value : list){
Systemoutprintln(value);
}
//遍历方法三
for(int i=0;i<listsize();i++){
Systemoutprintln(listget(i));
}
}
}
三种遍历的比较分析:
方法一遍历:
执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在循环过程中去掉某个元素,只能调用itremove方法。
方法二遍历:
内部调用第一种
方法三遍历:
内部不锁定, 效率最高, 但是当写多线程时要考虑并发 *** 作的问题
List接口的两种主要实现类ArrayList和LinkedList都可以采用这样的方法遍历
关于ArrayList与LinkedList的比较分析
a) ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
b) 当执行插入或者删除 *** 作时,采用LinkedList比较好。
c) 当执行搜索 *** 作时,采用ArrayList比较好。
一、数组的定义及赋初值
在Groovy语言中,数组的定义和Java语言中一样。
def a = new String[4]
def nums = newint[10]
def objs = new Object[3]
然后赋值也一样:
a[0] = 'a'
a[1] = 'b'
a[2] = 'c'
a[3] = 'd'
所不同的在于在数组定义的时候赋初值。
在Java语言里,对一个字符串数组这样定义:
String[] strs = new String[]{'a','b','c','d'};
而在Groovy语言中,对一个字符串数组则需要这样定义:
def strs = ['a','b','c','d'] as String[]
二、数组的遍历
在Groovy语言中,对数组的遍历方法很多,常用的是使用each方法:
aeach{
println it
}
当然,你也可以使用增强for循环:
for(it in a)
{
println it
}
你还可以使用如下的遍历方式:
(0<alength)each{
println a[it]
}
三、数组和List之间的转化
List对象转化成数组对象非常简单:
List list = ['a','b','c','d']
def strs = list as String[]
println strs[0]
绝对没有Java语言那么复杂:
List list = new ArrayList();
listadd("1");
String[] strs = (String[])listtoArray(new String[0]);
Systemoutprintln(strs[0]);
而从数组转化成List对象也非常简单:
def strs = ['a','b','c','d'] as String[]
List list = strstoList()
println listget(0)
你也可以这样转化:
def strs = ['a','b','c','d'] as String[]
List list = strs as List
println listget(0)
而在Java语言中,你需要这样转化:
List list = ArraysasList(strs)
Iterator it=listiterator();
while(ithasnext()){
Object[] arr=(Object[])itnext();
Systemoutprintln(arr[0]);
}
注意必须要强制类型转换,list的里面放的是什么就要转换成什么!
以上就是关于C++利用数组解决学生成绩排名。全部的内容,包括:C++利用数组解决学生成绩排名。、java:以下ArrayList数组居然越界求解,getDel()返回的是一个数组,该数组是gdList数组的一个子集、c语言指针和数组等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)