c语言指针和数组

c语言指针和数组,第1张

#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语言指针和数组等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/8861437.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-22
下一篇2023-04-22

发表评论

登录后才能评论

评论列表(0条)

    保存