• 数据结构与算法(3)- C++ STL与java se中的vector


    声明:虽然本系列博客与具体的编程语言无关。但是本文作者对c++相对比较熟悉,其次是java,所以难免会有视角上的偏差。举例也大多是和这两门语言相关。

    上一篇博客概念性的介绍了vector,我们有了大致的印象:vector不过就是看上去可以自增长的数组么。这篇博客将稍微介绍下STL与se中的vector,因为比较简单。

    STL中的vector

    stl vector的常用方法

    其实可以在这里看到所有的方法和使用说明。这里没有一一介绍的必要哈。这里要注意下C++98 C++11以及其他版本的方法可能稍有出入,你要根据自己的需要查看刚才的那个链接即可。

    stl vector的一些小细节

    使用细节:

    • 随着元素的插入,size不断变大,当size过大导致重新分配vector时,vector早期的迭代器会失效。
        
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	vector<int> vec;
    	for (int i = 0; i < 10; ++i) {
    		vec.push_back(i);		//添加元素
    	}
    
    	for(int val : vec)
    	{
    		cout << val << "  ";	// 0,1,2,3,4,5,6,7,8,9
    	}
    	cout << endl;
    
    	//迭代器
    	vector<int>::iterator it = vec.begin();
    	while (it != vec.end()) {
    		cout << *it << "  ";	// 0,1,2,3,4,5,6,7,8,9
    		it++;
    	}
    	cout << endl;
    	//重置迭代器it
    	it = vec.begin();
    
    	for (int i = 10; i < 25; ++i) {
    		vec.push_back(i);		//添加元素
    	}
    
    	//来一个新的迭代器
    	vector<int>::iterator itnew = vec.begin();
    	while (itnew != vec.end()) {
    		cout << *itnew << "  ";		//正常打印 0,1,2,3,4,5,6,7,8,9......
    		itnew++;
    	}
    	cout << endl;
    
    	//测试旧迭代器
    	while (it != vec.end()) {
    		cout << *it << "  ";	    //我会报错使程序当掉 0,1,2,3,4,5,6,7,8,9......
    		it++;
    	}
    	cout << endl;
    
    	system("pause");
    	return 0;
    }
    
    • vector::pop_back不返回任何值。

    java se 中的相关概念

    在java中,和vector更加接近的其实是ArrayList,但是其没有重载[],而是通过get与set方法获取与设置数据。当然java中也有Vector,只不过java中的Vector是同步的,可以由两个线程安全地访问一个Vector对象。但是,如果由一个线程访问Vector,代码要在同步操作上耗费大量时间。另外必须指出:这里的同步并不是完全的线程安全的,在两个操作之间并不是原子操作!!!。可参见这里

    java 对象的陷阱

    java中所有的变量都是引用,这给熟悉c++的人经常带来很大的困扰,从而产生很多bugs。今天就踩了一个坑,如果我们要在循环体中,为ArrayList add元素,那么一定要在添加元素前,new一个新的。直接看代码吧。

    stu = new student(); //这里一定要new一下

    public ArrayList<student> query() {
    		ArrayList<student> students = new ArrayList<student>();
    	    try {
    	        //1. 连接
    	        conn =  JDBCUtil.getConn();
    	        //2. statement
    	        st = conn.createStatement();
    	        String sql = "select * from t_stu";
    	        rs = st.executeQuery(sql);
    	       
    	        while(rs.next()){
    	        	stu = new student();	//这里一定要new一下
    	            stu.setid(rs.getInt("id"));
    	            stu.setage(rs.getInt("age"));
    	            stu.setname(rs.getString("name"));
    	            students.add(stu);
    	        }
    	        System.out.println(students);
    	    } catch (Exception e) {
    	        e.printStackTrace();
    	    }finally {
    	        JDBCUtil.release(conn, st, rs);
    	    }
    		return students;
    	}
    

    小秘密:下一篇将讲解list以及由list组成的基本数据结构。
    See you next time. Happy Coding!!!
    我的github

  • 相关阅读:
    SQL中 patindex函数的用法
    纵表与横表互转的SQL
    几种数据库的大数据批量插入【转】
    使用cmd命令行窗口操作SqlServer
    C#性能优化实践
    C# 图像处理(二)—— 黑白效果
    SQLSERVER系统视图
    SQLServer行列转换 Pivot UnPivot
    C#图片处理常见方法性能比较
    GSM局数据制作1(Erision)
  • 原文地址:https://www.cnblogs.com/dnhua/p/10087990.html
Copyright © 2020-2023  润新知