注册 登录
编程论坛 C++教室

求指教,求鞭笞,关于vector的元素添加。

yaobao 发布于 2013-01-15 10:55, 1571 次点击
string word;
vector<string> text;
while(cin>>word){
   text.push_back(word);
}
这是《C++ primer》上的一段示范代码,可是我就有疑问了,这样没有标定text的所占内存的大小,就循环添加元素,text在内存中是如何处理的啊,顺序?链式?这样做难道不会造成内存管理的混乱吗?
求指教啊
35 回复
#2
hahayezhe2013-01-15 11:06
处理方式与vector无关 由string自己处理
#3
hahayezhe2013-01-15 11:08
vector所管理的字节 只有sizeof(string)而已!字符内容由string 自己的构造处理
#4
rjsp2013-01-15 11:08
顺序,自动扩张内存

举个例子,假设
int* p = new int[10];
size_t len = 0;
我可以添加10个元素,每添加一个则将len加一
当我添加第11个时,我先这么做:
  int* p_ = new int[20];
  memcpy( p_, p, 10*sizeof(int) );
然后就可以再添加10个。
#5
peach54602013-01-15 11:18
汗...你还真是SM上瘾了呀
#6
peach54602013-01-15 11:20
std::string在stl里面是char*的实现
所以在push_back的时候,实际上是push_back了一个int
所以不需要定义长度...

在erse的时候,会隐式的调用string的析构释放内存...
#7
peach54602013-01-15 11:23
以下是引用peach5460在2013-1-15 11:20:24的发言:

std::string在stl里面是char*的实现
所以在push_back的时候,实际上是push_back了一个int
所以不需要定义长度...

在erse的时候,会隐式的调用string的析构释放内存...

再顺便跟你普及一下push_back
push_back实现的是浅拷贝
所以,只是把指针赋过去了...
#8
yaobao2013-01-15 11:33
以下是引用rjsp在2013-1-15 11:08:34的发言:

顺序,自动扩张内存

举个例子,假设
int* p = new int[10];
size_t len = 0;
我可以添加10个元素,每添加一个则将len加一
当我添加第11个时,我先这么做:
  int* p_ = new int[20];
  memcpy( p_, p, 10*sizeof(int) );
然后就可以再添加10个。
汗啊,那不是,添加几个元素就复制一次?这可是能动态增加元素了,可这招也.....
#9
yaobao2013-01-15 11:37
以下是引用peach5460在2013-1-15 11:20:24的发言:

std::string在stl里面是char*的实现
所以在push_back的时候,实际上是push_back了一个int
所以不需要定义长度...
 
在erse的时候,会隐式的调用string的析构释放内存...
???小猪兄弟,没看懂啊,我的C++才刚开始学,有的二专业术语看不懂啊
#10
yaobao2013-01-15 11:39
以下是引用peach5460在2013-1-15 11:23:26的发言:

 
再顺便跟你普及一下push_back
push_back实现的是浅拷贝
所以,只是把指针赋过去了...
小猪兄弟,这回的听懂了
#11
peach54602013-01-15 11:46
以下是引用yaobao在2013-1-15 11:39:40的发言:

小猪兄弟,这回的听懂了

小猪?
#12
peach54602013-01-15 11:48
以下是引用yaobao在2013-1-15 11:33:31的发言:

汗啊,那不是,添加几个元素就复制一次?这可是能动态增加元素了,可这招也.....


貌似我跟你说错了
std::string是vector<base_char>貌似
cstring才是char*
忘了,你自己查一下吧...反正记的是指针,所以不需要字符串长度...

回到现在这个问题...
不至于添加几个元素就复制一次...
vector是有冗余的...
#13
yaobao2013-01-15 11:50
回复 11楼 peach5460
嘿嘿,你的头像可不就是小猪?
#14
yaobao2013-01-15 11:55
哎,越看越糊涂了,其实可能是我太急了,模板好完全没接触到,才接触到容器和类就深扣这个问题可能是太早了,兄弟们的解释,在网上找的东西竟看不懂,还是先放放吧,谢谢兄弟们了,我还是继续往下学,这个问题先记着吧。
头疼啊。。。。。。。。。。。。。。。。。
#15
peach54602013-01-15 12:38
以下是引用yaobao在2013-1-15 11:55:19的发言:

哎,越看越糊涂了,其实可能是我太急了,模板好完全没接触到,才接触到容器和类就深扣这个问题可能是太早了,兄弟们的解释,在网上找的东西竟看不懂,还是先放放吧,谢谢兄弟们了,我还是继续往下学,这个问题先记着吧。
头疼啊。。。。。。。。。。。。。。。。。

侯先生有一本stl源码解析...甚为经典,我到现在还没看懂,你可以试一下...
#16
peach54602013-01-15 12:39
顺便问一句:
你是想问push_back的算法,还是想问为什么string不定长还可以存到vector里面
或者两个都想问?
#17
TonyDeng2013-01-15 14:03
先跳到第九章浏览一下,然后继续。
#18
peach54602013-01-15 14:48
第九章?primer?
#19
peach54602013-01-15 14:49
果然是primer,顺序容器...
#20
TonyDeng2013-01-15 14:56
是的,那一章很重要。
#21
peach54602013-01-15 15:57
以下是引用TonyDeng在2013-1-15 14:56:07的发言:

是的,那一章很重要。

STL都很重要
不重复造轮子...
#22
信箱有效2013-01-15 15:58
幸好我自知驽钝 没看那本书。 刚开始就讲那么多标准库
#23
TonyDeng2013-01-15 16:01
第四版附送的《C++編程規範》,也是值得仔細閱讀的。
#24
peach54602013-01-15 16:02
以下是引用TonyDeng在2013-1-15 16:01:13的发言:

第四版附送的《C++編程規範》,也是值得仔細閱讀的。

谷歌的编码规范才是全球最好的,没有之一
#25
peach54602013-01-15 16:03
以下是引用信箱有效在2013-1-15 15:58:32的发言:

幸好我自知驽钝 没看那本书。 刚开始就讲那么多标准库

不知道stl是你的损失哦

不过正如我在另一个帖子里说的
primer乃至primer plus不适合一无所知的人入门...
老谭的书还是有一定道理的...
#26
TonyDeng2013-01-15 16:06
有一定的實踐經驗,自然能夠總結出一套差不多的道理,跟規範說的相吻合。有些東西,自己不碰過釘子,是不明白人家那些說法有道理的。
#27
peach54602013-01-15 16:09
精辟...
呵呵,我只是开个玩笑...
不过谷歌的那套的确写得很好,对初学者很有帮助
我有些劣根性,至今还未达到他的标准
#28
TonyDeng2013-01-15 16:13
完全遵守是不可能的,只是盡可能警惕而已。無論規範還是標準,都只作參考用途,不是教條。自己的實踐覺得那樣好,就聽從,覺得不好,完全可以不理,直到碰釘為止,碰不到,真的可行,沒啥大不了的。
#29
yaobao2013-01-15 16:20
T版,你和我们QQ群的群主是同一类,都是BUG,我就发现怎么没有你们不知道的东西啊。
#30
peach54602013-01-15 16:21
以下是引用yaobao在2013-1-15 16:20:06的发言:

T版,你和我们QQ群的群主是同一类,都是BUG,我就发现怎么没有你们不知道的东西啊。

嗯,都是牛人,哈哈...
#31
TonyDeng2013-01-15 16:22
BUG是大蟲,大禍害。
#32
信箱有效2013-01-15 16:50
没有什么损失不损失的。用得到就学 用不到就不学 自己根据自身情况选择而已。
我的兴趣在软件调试这块 汇编 C 系统编程。 MFC应该是我学的最“高级”的一个东东了,为了理解MFC 就必须学C++,我看的是Visual C++ 2005入门经典 1000多页 前半是讲基础C++ 后半是讲MFC 很适合我。至于STL什么的,如果有需要 完全可以以后再学。
人笨 没办法 只能这样了。
#33
yaobao2013-01-15 17:09
BUG  不要理解为虫,要理解为超越法则而存在的事物
#34
peach54602013-01-16 10:13
耶?今天你不搞SM了?
#35
宋立鹏2013-01-16 13:28
vector内存没有固定的大小,可以随意存取,这就是比数组好用的地方了
#36
peach54602013-01-16 20:46
以下是引用宋立鹏在2013-1-16 13:28:56的发言:

vector内存没有固定的大小,可以随意存取,这就是比数组好用的地方了

其实随意存取多了list还不错
1