求助:vector的使用问题

wuhuang95 2004-01-07 10:12:08
vector<int> vn;
int i;
int * pn1;
int * pn2;

i = 1;
vn.push_back(i);
pn1 = vn.begin(); 此时pn1指向的值为1

i = 2;
vn.push_back(i);
pn2 = vn.begin(); 此时pn2指向的值为1,但pn1与pn2的地址值不相同??

就是说vector每push_back一个元素,vector.begin()的地址就发生变化。我想问一下如何才能防止这种地址变化的情况,因为我希望有一个全局变量始终记着vector的第一个元素的地址,如何地址老发生变化,那这个全局变量就没用了!好惨,请大侠赐教!!
谢谢!!!
...全文
348 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
vollin 2004-01-13
  • 打赏
  • 举报
回复
to 楼主:本来我倒是有几种实现方案,除了一种和 once168(once168)的第二种方法相同外(在线里不存储指针,而存储点的拷贝)其它方法都比不上once168(once168)提供的第一种方法好,所以就不献丑了。
once168 2004-01-11
  • 打赏
  • 举报
回复
关系与容器:
此例Line<-->Point 是关系
而vector<*>在此作用是容器,关系的表述与容器无关


楼主结贴吧!
wuhuang95 2004-01-09
  • 打赏
  • 举报
回复
To vollin:
我的数据结构如下:
struct Point
{
 float x,y,z;
}
struct Line
{
 Point * ppPoint[2];
}
vector<Point> vPoint; //点集,事先不知点的个数,是不断插入增加的
vector<Line> vLine; //线集,在点不断插入的同时按一定原则生成线。(保存构成每条线的两端点的指针!)这时候就要保存vPoint中特定元素的时针。

如果用动态数组、链表或其他方法该如何做???请赐教!!
sevencat 2004-01-09
  • 打赏
  • 举报
回复
还用vector干吗?
直接Point[10000]既简单又明了。
vollin 2004-01-09
  • 打赏
  • 举报
回复
vector的确具有动态数组的功能,但是像你那样使用就根本没有用到所谓的动态,和使用一般的数组有什么区别?主要是用法。
所谓动态就是你可以不去管它的数据怎样存储,直接将它当成一个可以变化长度的数组。你不需要直接记录它用来存储数据的地址,只需要保存它本身的地址或其引用即可。然后再通过它提供的方法来访问数据成员,而不是直接使用它存储数据的指针。
而且如果你没有用到向量的特性的话,只是用到动态数组,我仍然建议你使用CArray,你只需要查一下MSDN就可以很快上手,非常方便(我之所以要重写是因为不喜欢CObject)。因为vector是一个向量,所考虑的问题比动态数组多得多,使用起来也就不那么方便。
wuhuang95 2004-01-09
  • 打赏
  • 举报
回复
多谢楼上各位兄弟!!!

vollin(),你的理解没错!!!
感觉once168说的第一种不错,第二种似乎等同于我的结构!?

thanks!!!
vollin 2004-01-09
  • 打赏
  • 举报
回复
楼上的两种方法均可行,尤其推荐使用第一种方法
once168 2004-01-09
  • 打赏
  • 举报
回复
应该如下做:

vector<Point*> vPoint; //点集,事先不知点的个数,是不断插入增加的
vector<Line*> vLine; //线集,在点不断插入的同时按一定原则生成线。(保存构成每条线的两端点的指针!)这时候就要保存vPoint中特定元素的时针。

在使用时分配内存

或者如下做:
struct Point
{
 float x,y,z;
}
struct Line
{
 vector<Point>::iterator ppPoint[2];
}
vector<Point> vPoint; //点集,事先不知点的个数,是不断插入增加的
vector<Line> vLine;
vollin 2004-01-09
  • 打赏
  • 举报
回复
不知道我的理解有没错?
1。你的点集,是无序的,因此只会有append操作而不会有insert操作;
2。由于有线与点的依赖,点集没有删除操作;
3。你的一条线,对应于两个点,两个点有可能属于不同的点集(有多个点集)。
jyc_nj 2004-01-08
  • 打赏
  • 举报
回复
aph(心往)兄:不知道你用什么方法测试的?我用VC6带的stl,并没有发现会自动分配空间的情况,C++标准中没有定具体的行为,大概是不同版本的不同行为吧.

用int *还是用iterator应是具体情况具体对待,如果考虑到兼容性和风格一致性的话,比如你只是用vector帮着包装和管理一块内存, 而这块内存你还是要象以前那样使用,那么,使用int *, 这一并非从C转C++的遗留产物, 的东东,所以,最多只能说是你摒弃高露洁,又用起了中华牌(也许你的牙齿不会只在意外表,而且支持了国货).
wuhuang95 2004-01-08
  • 打赏
  • 举报
回复
我觉得vector包含所有数组和链表的特性,应该也具动态数组的功能吧,不知道是不是对的!?!
wuhuang95 2004-01-08
  • 打赏
  • 举报
回复
谢谢楼上的,我也知道那么做太浪费了一些,但本人不知道有哪些更好的办法!你能介绍一些动态数组吗?老实说我对动态数组的概念不太清楚,请赐教!谢先!!!
vollin 2004-01-08
  • 打赏
  • 举报
回复
to 楼主:
你所说的:
我决定还是用vector吧,先开辟10000000空间好了!
我想说的是数组和链表解决这个问题的关键就在于时间与空间的问题,而动态数组是一个很好的折中,你这样做的话,会浪费大量的内存内间。如果是自己写着玩或做测试还无所谓,要是真正的写程序也这样考虑问题的话,我想这不是一种好的态度。

aph 2004-01-08
  • 打赏
  • 举报
回复
查了一下,确实不是标准定义的一部分,而且不同版本的实现是不一样的,看来还是自己reserve一下比较安全。
vollin 2004-01-08
  • 打赏
  • 举报
回复
to jyc_nj(老蔣)
我的CArr<TYPE>只不过是一个动态数组类,不支持向量运算(我的支持向量运算的CNumArr<TYPE>:public CArr<TPYE>)。
和vector相比,CArr支持复杂类,当然你的类得有一个无参的构造与析构及需重载=,若要能够排序需重载><;
而且我的CArr支持自动删除的选择,即可以让它自动析构每一个元素(这样就完全当它是一个简单变量)也可以把当成一个buffer来用(只要记录下它的内容地址就可以在其它地方重构),对于成员的访问用[]在debug版中可以自动检测边界;对于内存的分配我采用的策略相信也比CArray或vector要好一些;
当然最方便的便是可以自己定义规则,并增加规则。
jyc_nj 2004-01-07
  • 打赏
  • 举报
回复
不知道vollin() 兄的CArr何处比std::vector强???
jyc_nj 2004-01-07
  • 打赏
  • 举报
回复
你预估出大小.
vector<int> vn;
vn.reserve(MAX);//一次开辟足够空间.
//capacity()可以得到预留空间大小.
与其保存头位置(这可不是stl的推荐作法),还不如保存vn的引用,需要时再.begin()不好么?

vector<int> vn(MAX);//!!!
这怎么可以??push_back一下,还是会飞.
而且一旦分配就是double空间,后果可怕(这时候会重新分配,拷贝复制以作移动...吐血得慢)



Kingore 2004-01-07
  • 打赏
  • 举报
回复
你以前不是用vector码?改到用list应该很方便的啊,
为什么又转手用mfc了?


CList<int,int> 就是说里面存的是int,返回的时候也是int.
CList
This class supports ordered lists of nonunique objects accessible sequentially or by value. CList lists behave like doubly-linked lists.

template<
class TYPE,
class ARG_TYPE >

class CList : public CObject
Parameters
TYPE
Specifies the type of object stored in the list.
ARG_TYPE
Specifies the type used to reference objects stored in the list. It can be a reference.
Remarks
A variable of type POSITION is a key for the list. You can use a POSITION variable as an iterator to traverse a list sequentially and as a bookmark to hold a place. A position is not the same as an index, however.

Element insertion is very fast at the list head, at the tail, and at a known POSITION. A sequential search is necessary to look up an element by value or index. This search can be slow if the list is long.

If you need a dump of individual elements in the list, you must set the depth of the dump context to one or greater.

Certain methods of this class call global helper functions that must be customized for most uses of the CList class.

Example
// CList is a template class that takes two template arguments.
// The first argument is type stored internally by the list, the
// second argument is the type used in the arguments for the
// CList methods.

// This code defines a list of ints.
CList<int,int> myList;

// This code defines a list of CStrings
CList<CString,CString&> myList;

// This code defines a list of MYTYPEs,
//NOTE: MYTYPE could be any struct, class or type definition
CList<MYTYPE,MYTYPE&> myList;

wuhuang95 2004-01-07
  • 打赏
  • 举报
回复
CList<>的尖括号内的两个参数是什么意思啊??
kulukyo 2004-01-07
  • 打赏
  • 举报
回复
CList,CPtrList,CArray,CObArray....

我用的最多的是前两个,很好用
加载更多回复(23)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧