鱼C论坛

 找回密码
 立即注册
查看: 14176|回复: 10

刚学完小甲鱼的C++教程,vector(向量)可以push_back()结构体么?

[复制链接]
发表于 2013-1-30 00:31:20 | 显示全部楼层 |阅读模式
10鱼币
以前自己学过数据结构,数据结构当时的链表使用的是C语言的结构体,并且最后有个指向结构体的指针,来串到一起的。
学完小甲鱼的C++快速入门之后,我想vector可以代替链表吗?就是说在vector中push_back一个结构体。

我自己的思路如下:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct node
{
    int a;
    int b;
    int c;
} node_ST,*node_PST;
int main(int argc,char *argv[])
{
    vector < node_ST > struct_vector;
    vector<node_ST> ::iterator iter=struct_vector.begin ();
    node_ST struct_node;

    struct_node.a =0;
    struct_node.b=1;
    struct_node.c=2;
    struct_vector.push_back (struct_node);        //这里出错了………………

    while(iter!=struct_vector.end ())
    {
        
        cout<<iter->a<<endl;
        cout<<iter->b<<endl;
        cout<<iter->c<<endl;
        iter++;
    }
    return EXIT_SUCCESS;
}
我的想法是先定义一个结构体,然后在给结构体的每个元素赋值,然后再将结构体push_back(),这样编译过程没有报错。可是在运行时出错了。出错行上已经标注。
请问各位,是不是vector不支持结构体?只能支持int,string等?


主要问题:
1.vector是否支持结构体和类?
2.如果支持,如何push_back等操作.
给我个相关文章也可以~~
谢咯

最佳答案

查看完整内容

至于你的程序报错,并不是vector的问题,而是iter的问题,在操作iter的时候是不能对vector操作的,操作了指针就变了。只要将iter的代码移动到操作的时候就可以。 修改后代码:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-1-30 00:31:21 | 显示全部楼层
至于你的程序报错,并不是vector的问题,而是iter的问题,在操作iter的时候是不能对vector操作的,操作了指针就变了。只要将iter的代码移动到操作的时候就可以。
修改后代码:
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef struct node
  7. {
  8.     int a;
  9.     int b;
  10.     int c;
  11. } node_ST,*node_PST;

  12. int main(int argc,char *argv[])
  13. {
  14.     vector < node_ST > struct_vector;
  15.    
  16.     node_ST struct_node;

  17.     struct_node.a =0;
  18.     struct_node.b=1;
  19.     struct_node.c=2;
  20.     struct_vector.push_back (struct_node);        //这里出错了………………

  21.         vector<node_ST> ::iterator iter=struct_vector.begin ();
  22.        
  23.     while(iter!=struct_vector.end ())
  24.     {        
  25.         cout<<iter->a<<endl;
  26.         cout<<iter->b<<endl;
  27.         cout<<iter->c<<endl;
  28.         iter++;
  29.     }
  30.         getchar();
  31.     return 0;
  32. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 08:17:49 | 显示全部楼层
本帖最后由 小新110 于 2013-1-30 08:19 编辑

可以的兄弟。只要定义的时候将结构体放入就行。比如:vector<CPoint>vc。我现在就在用。这里有个实例:http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fsci.faq%2FMathematics%2Fdiscuss%2F2008%2F200804%2FM.1211990667.V0
其实自己编个简单的代码验证一下即可。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 08:24:24 | 显示全部楼层
你标记的那句没有错,是iter赋值太早了,那时候向量里面都没有东西,所以出错了
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef struct node
  7. {
  8.     int a;
  9.     int b;
  10.     int c;
  11. } node_ST,*node_PST;

  12. int main(int argc,char *argv[])
  13. {
  14.     vector < node_ST > struct_vector;
  15.    
  16.     node_ST struct_node;

  17.     struct_node.a =0;
  18.     struct_node.b=1;
  19.     struct_node.c=2;
  20.    
  21.     struct_vector.push_back (struct_node);        
  22.         vector<node_ST> ::iterator iter=struct_vector.begin ();//这个放在这里就可以了
  23.     while(iter!=struct_vector.end ())
  24.     {
  25.         
  26.         cout<<iter->a<<endl;
  27.         cout<<iter->b<<endl;
  28.         cout<<iter->c<<endl;
  29.         iter++;
  30.     }
  31.     system("pause");
  32.     return EXIT_SUCCESS;
  33. }
复制代码

评分

参与人数 1鱼币 +5 收起 理由
寒江孤叶丶 + 5 谢谢哦~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 10:58:45 | 显示全部楼层
vector内部数据是连续存放的,因此当新增元素或者删除元素的时候都可能要改变原先所有元素的内存分布;这种改变一旦发生,原先的迭代器就失效了,list就没有这个问题。

评分

参与人数 1鱼币 +5 收起 理由
寒江孤叶丶 + 5 感谢版主的热心帮助,那么迭代器是要放到最.

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-30 11:07:13 | 显示全部楼层

那是不是每次加入或者删除元素都要重新给迭代器赋值?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 11:20:17 | 显示全部楼层
寒江孤叶丶 发表于 2013-1-30 11:07
那是不是每次加入或者删除元素都要重新给迭代器赋值?

是啊,迭代器可不能一直存在用,每次都要重新来
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-30 11:22:02 | 显示全部楼层
小新110 发表于 2013-1-30 11:20
是啊,迭代器可不能一直存在用,每次都要重新来

OK那就明白了~谢谢哈~ 小甲鱼这c++快速入门讲的太精简了……我还是买本谭浩强的书巩固一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 11:23:39 | 显示全部楼层
寒江孤叶丶 发表于 2013-1-30 11:22
OK那就明白了~谢谢哈~ 小甲鱼这c++快速入门讲的太精简了……我还是买本谭浩强的书巩固一下吧

额,要买书的话买c++ Primer,理论讲的很清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-1-30 11:38:51 | 显示全部楼层
仰望天上的光 发表于 2013-1-30 10:58
vector内部数据是连续存放的,因此当新增元素或者删除元素的时候都可能要改变原先所有元素的内存分布;这种 ...

赞,版主一针见血
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-2-2 21:37:17 | 显示全部楼层
顶一下。太对了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-8 16:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表