1. 程式人生 > >資料結構與演算法(3)- C++ STL與java se中的vector

資料結構與演算法(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