作者NTUmaki (西木野真姬)
看板C_and_CPP
标题[问题] vector 使用问题
时间Mon Sep 7 12:34:59 2020
开发平台(Platform): (Ex: Win10, Linux, ...)
mac
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
c17
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
null
问题(Question):
想要 new vector<int>() 之後 access vector
喂入的资料(Input):
null
预期的正确结果(Expected Output):
1
错误结果(Wrong Output):
没有运算子 "=" 符合这些运算元 -- 运算元类型为: std::__::vector<int,::std::__1::allocator<int>> = int
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
vector<int> *v;
v = new vector<int>(5);
v[2] = 1; // 这里开始错
cout << v[2];
补充说明(Supplement):
刚开始从 C 转 C++,很不习惯用已经写好的东西(不懂里面怎麽运作QQ)
1. 我在想是不是因为 vector 因为是动态的,记忆体位址跟阵列不一样,不会连续配置
所以我宣告 vector 指标之後,v[2] 就真的是 v 记忆体位置开始的第三格,而不是真正意义上 vector 资料结构的第三格
2. 这样就牵扯到 vector 内部怎麽写,所以想在请问一下 vector 内部是不是像 linked list 一样? 这样 random access 是不是需要 O(n)?
3. 另外想问一下有没有什麽资源是适合熟悉C语言,要转 C++ 的。我目前是看 cplusplus.com 里面一个一个看他的语法/机制,但内部怎麽运作还是不懂
(像是 set 我上网查才知道里面好像是用 rbtree,为何不用 graph???复杂度应该更好)
不然就是去 github 上直接看C++资料结构的code(以前都用C自己刻,所以想说直接看C++怎麽刻会学比较快)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.171.184.16 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1599453301.A.B2D.html
1F:推 oToToT: 1.你应该误会vector怎麽用了吧,我猜你要的只是vector<int 09/07 13:01
2F:→ oToToT: > v(5),不需要用new的 09/07 13:01
我原本是写在 class 里面,初始化的时候给参数才决定 vector 大小
3F:→ oToToT: 2. vector底层实作基本上就是array,能够O(1) push_back原 09/07 13:04
那这样我为何不能 new 之後直接 access v[2] ?
4F:→ oToToT: 因则是他会自动在底层阵列满的时候自动再重新把阵列变大, 09/07 13:04
5F:→ oToToT: 但这样做复杂度均摊下来还是好的 09/07 13:04
6F:→ oToToT: (无关的部分:可以问用图存set该怎麽做吗? 09/07 13:05
不是用 union-by-rank + path compression 吗? (其实说是 graph,但其实就 tree 只是不是平常写的 tree)
※ 编辑: NTUmaki (1.171.184.16 台湾), 09/07/2020 13:14:09
啊 应该说 disjoint set啦,跟数学的 graph有点搞在一起了><
※ 编辑: NTUmaki (1.171.184.16 台湾), 09/07/2020 13:17:03
※ 编辑: NTUmaki (1.171.184.16 台湾), 09/07/2020 13:19:17
8F:→ james732: 你需要的可能是先预留空间? 09/07 14:11
9F:推 steve1012: v是pointer to vector. 并没有告诉你会直接指到underly 09/07 15:09
10F:→ steve1012: ing data. 09/07 15:09
11F:推 moebear: 直接改写的话 你得用(*v)[2]=1; 09/07 15:12
嗯嗯 所以vector的变数名称不能跟阵列一样当成位址
12F:→ descent: 你需要 "C++ 标准库", 买一本来参考 09/07 15:24
13F:推 descent: 书上用了 11 页在说明 vector, 应该可以解除你的疑惑 09/07 15:26
14F:→ descent: 你如果是要理解内部实作, 那要找 "stl 源码剖析" 这本书 09/07 15:29
感谢!
15F:推 kaneson: 楼上 *v正解 09/07 15:54
所以vector没有预设把变数名称当位址没错吧?
16F:→ a58524andy: disjoint set没ordering吧(? 可是associative contain 09/07 16:41
17F:→ a58524andy: ners的iterator traversal要参照其key的ordering 09/07 16:41
18F:→ a58524andy: 加上标准也有指定一些复杂度限制 09/07 16:42
19F:→ a58524andy: 可能是因为这样所以常见的都用rb-tree 09/07 16:42
好的 感谢...
※ 编辑: NTUmaki (27.247.233.249 台湾), 09/07/2020 16:43:00
※ 编辑: NTUmaki (27.247.233.249 台湾), 09/07/2020 16:43:21
※ 编辑: NTUmaki (27.247.233.249 台湾), 09/07/2020 16:43:55
※ 编辑: NTUmaki (27.247.233.249 台湾), 09/07/2020 16:44:21
20F:推 kaneson: v本身是pointer, 不能把它当vector去access, c的pointer 09/07 16:56
21F:→ kaneson: 可以操作 v[2] 只是语法糖,不适用vector, (*v)[2] 或 v 09/07 16:56
22F:→ kaneson: ->at(2) 才正确 09/07 16:56
了解!感谢
※ 编辑: NTUmaki (27.247.233.249 台湾), 09/07/2020 17:41:09
23F:推 oToToT: 说实在我还是不知道要怎麽用disjoint set当作set,是我误 09/07 22:03
24F:→ oToToT: 会了甚麽吗@@,应该说这两者根本没关吧,而且disjoint set 09/07 22:04
25F:→ oToToT: 其实也是棵树 09/07 22:04
26F:推 oToToT: 我觉得正确的说法应该是v[??]後的type是vector<int>,所以 09/07 22:08
27F:→ oToToT: 你让他=2是完全没有道理的,普通的阵列int *a; a[?]的type 09/07 22:09
28F:→ oToToT: 是int,那这时候=2当然是合法的操作 09/07 22:09
29F:→ smartclever: 这...应该用个v.resize()就解决了吧... 09/11 17:51