vector assign()麻烦 [英] vector assign() trouble

查看:199
本文介绍了vector assign()麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试更换


模板< class T void

set2vector(const set< T& s,vector< T& v)

{

typename set< ; T> :: iterator it;

for(it = s.begin(); it!= s.end(); it ++){

v.push_back( *它);

}

}





模板< class T void

set2vector(const set< T& s,vector< T& v)

{

v.assign (BE(s));

}


但是我遇到了分段错误。我在Fedora core 4上使用g ++。这些代码段等价于
吗?

I am trying to replace

template < class T void
set2vector (const set < T &s, vector < T &v)
{
typename set < T >::iterator it;
for (it = s.begin (); it != s.end (); it++) {
v.push_back (*it);
}
}

with

template < class T void
set2vector (const set < T &s, vector < T &v)
{
v.assign(BE(s));
}

but I get a segmentation fault. I am using g++ on Fedora core 4. Aren''t
these code segments equivalent?

推荐答案

忘了定义


#define BE(v)v.begin(),v.end()

forgot the definition of

#define BE(v) v.begin(), v.end()


na***********@gmail.com 写道:
na***********@gmail.com wrote:

我正在尝试更换


template< class T void

set2vector(const set< T& s,vector< T& v)

{

typename set< ; T> :: iterator it;

for(it = s.begin(); it!= s.end(); it ++){

v.push_back( *它);

}

}





模板< class T void

set2vector(const set< T& s,vector< T& v)

{

v.assign (BE(s));

}


但是我遇到了分段错误。我在Fedora core 4上使用g ++。

这些代码段是否相同?
I am trying to replace

template < class T void
set2vector (const set < T &s, vector < T &v)
{
typename set < T >::iterator it;
for (it = s.begin (); it != s.end (); it++) {
v.push_back (*it);
}
}

with

template < class T void
set2vector (const set < T &s, vector < T &v)
{
v.assign(BE(s));
}

but I get a segmentation fault. I am using g++ on Fedora core 4.
Aren''t these code segments equivalent?



当然不是。如果向量是空的,那么推回它就会用这些元素填充

。分配不会在向量中引入新元素

,而是更改现有

的值。后一个变体实际上相当于


{size_t i = 0;

for(it = s.begin(); it!= s.end( ); ++ it)

v [i ++] = * it;

}


您需要先拨打' 'assign''with''resize'':


v.resize(s.size());

v.assign(BE(s) );


V

-

请在通过电子邮件回复时删除资金'A' />
我没有回复最热门的回复,请不要问

Of course not. If the vector is empty, pushing back into it fills
it with those elements. Assigning does not introduce new elements
into the vector, but instead changes the values of the existing
ones. The latter variant is actually equivalent to

{ size_t i = 0;
for (it = s.begin(); it != s.end(); ++it)
v[i++] = *it;
}

You need to precede your call to ''assign'' with ''resize'':

v.resize(s.size());
v.assign(BE(s));

V
--
Please remove capital ''A''s when replying by e-mail
I do not respond to top-posted replies, please don''t ask



na *********** @ gmail.com skrev:

na***********@gmail.com skrev:

我想替换


模板< class T void

set2vector(const set< T& s,vector< T& v)

{

typename set< ; T> :: iterator it;

for(it = s.begin(); it!= s.end(); it ++){

v.push_back( *它);

}

}





模板< class T void

set2vector(const set< T& s,vector< T& v)

{

v.assign (BE(s));

}


但是我遇到了分段错误。我在Fedora core 4上使用g ++。这些代码段相当于哪些

I am trying to replace

template < class T void
set2vector (const set < T &s, vector < T &v)
{
typename set < T >::iterator it;
for (it = s.begin (); it != s.end (); it++) {
v.push_back (*it);
}
}

with

template < class T void
set2vector (const set < T &s, vector < T &v)
{
v.assign(BE(s));
}

but I get a segmentation fault. I am using g++ on Fedora core 4. Aren''t
these code segments equivalent?



正如Victor已经指出的那样,指定分配并且不会创建新的

元素。但是我没有看到第一个

地方需要这个功能:为什么不简单地写一下

std :: vector< Tv(s.begin(),s。结束());


?这几乎肯定是最佳代码。


/ Peter

As Victor already pointed out, assign assigns and does not create new
elements. But I do not see the need for the function in the first
place: why not simply write
std::vector<Tv(s.begin(),s.end());

? This will almost certainly be optimal code.

/Peter


这篇关于vector assign()麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆