经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
数据结构与算法(3)- C++ STL与java se中的vector
来源:cnblogs  作者:dnhua  时间:2018/12/10 9:46:40  对本文有异议

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

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

STL中的vector

stl vector的常用方法

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

stl vector的一些小细节

使用细节:

  • 随着元素的插入,size不断变大,当size过大导致重新分配vector时,vector早期的迭代器会失效。
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<int> vec;
  7. for (int i = 0; i < 10; ++i) {
  8. vec.push_back(i); //添加元素
  9. }
  10. for(int val : vec)
  11. {
  12. cout << val << " "; // 0,1,2,3,4,5,6,7,8,9
  13. }
  14. cout << endl;
  15. //迭代器
  16. vector<int>::iterator it = vec.begin();
  17. while (it != vec.end()) {
  18. cout << *it << " "; // 0,1,2,3,4,5,6,7,8,9
  19. it++;
  20. }
  21. cout << endl;
  22. //重置迭代器it
  23. it = vec.begin();
  24. for (int i = 10; i < 25; ++i) {
  25. vec.push_back(i); //添加元素
  26. }
  27. //来一个新的迭代器
  28. vector<int>::iterator itnew = vec.begin();
  29. while (itnew != vec.end()) {
  30. cout << *itnew << " "; //正常打印 0,1,2,3,4,5,6,7,8,9......
  31. itnew++;
  32. }
  33. cout << endl;
  34. //测试旧迭代器
  35. while (it != vec.end()) {
  36. cout << *it << " "; //我会报错使程序当掉 0,1,2,3,4,5,6,7,8,9......
  37. it++;
  38. }
  39. cout << endl;
  40. system("pause");
  41. return 0;
  42. }
  • 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一下

  1. public ArrayList<student> query() {
  2. ArrayList<student> students = new ArrayList<student>();
  3. try {
  4. //1. 连接
  5. conn = JDBCUtil.getConn();
  6. //2. statement
  7. st = conn.createStatement();
  8. String sql = "select * from t_stu";
  9. rs = st.executeQuery(sql);
  10. while(rs.next()){
  11. stu = new student(); //这里一定要new一下
  12. stu.setid(rs.getInt("id"));
  13. stu.setage(rs.getInt("age"));
  14. stu.setname(rs.getString("name"));
  15. students.add(stu);
  16. }
  17. System.out.println(students);
  18. } catch (Exception e) {
  19. e.printStackTrace();
  20. }finally {
  21. JDBCUtil.release(conn, st, rs);
  22. }
  23. return students;
  24. }

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号