資料結構與演算法(3)- C++ STL與java se中的vector
阿新 • • 發佈:2018-12-17
宣告:雖然本系列部落格與具體的程式語言無關。但是本文作者對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