l***e 发帖数: 480 | 1 想删向量里后面的元素.
元素是一个结构sn,由一个字符串name和一个整数count构成。
向量vsn已排好序。因为remove删不掉。就想用pop_back删。
while( vsn.end().count < 2 ) vsn.pop_back();
//将向量里元素中count值小于2的元素,删除。
编译时,总抱错。
error: âclass __gnu_cxx::__normal_iterator
allocator > >â has no member named âcountâ
while( (vsn.end()).count < 2 ) vsn.pop_back();
while( *(vsn.end()).count < 2 ) vsn.pop_back();
while( (*(vsn.end())).count < 2 ) vsn.pop_back();
都不行。
vsn.pop_back();没错,单句执行没问题。
如何引用最后一个元素的成员变量。
或者还有 | k****f 发帖数: 3794 | 2 end()元素越界了。
vsn[vsn.size()-1]才是最后一个元素
【在 l***e 的大作中提到】 : 想删向量里后面的元素. : 元素是一个结构sn,由一个字符串name和一个整数count构成。 : 向量vsn已排好序。因为remove删不掉。就想用pop_back删。 : while( vsn.end().count < 2 ) vsn.pop_back(); : //将向量里元素中count值小于2的元素,删除。 : 编译时,总抱错。 : error: âclass __gnu_cxx::__normal_iterator: allocator > >â has no member named âcountâ : while( (vsn.end()).count < 2 ) vsn.pop_back(); : while( *(vsn.end()).count < 2 ) vsn.pop_back();
| l***e 发帖数: 480 | 3 搞定了,多谢。
用下标访问是个好主意。
另外,还有个问题。
需要建个树,每个节点(一个结构体)可能无后续(无指针),一个子节点,或可能三五个
子节点。
最坏情况,不可预计。
如果不是给每个节点固定分配最大值指针,比如,五个或七个指针。
可否动态实现,按需分配?
就是如何实现? | t****t 发帖数: 6806 | 4 while (!vsn.empty() && vsn.back().count<2) vsn.pop_back();
因为你不能保证vsn.back()总是存在, 所以你要先看它是不是空的.
如果你知道一个iterator a, 要从这个iterator一直删到最后, 可以写
vsn.erase(a, vsn.end());
std::remove不是删除元素用的, 是把要删的元素交换到range的最后. 删除用
container.erase(). 所以对于vector, 可以这样用:
vsn.erase(remove(vsn.begin(), vsn.end(), your_condition), vsn.end());
这些在effective STL里都有...STL虽然很容易用, 但是完全不看手册光凭函数名想当
然, 也是不行的.
【在 l***e 的大作中提到】 : 想删向量里后面的元素. : 元素是一个结构sn,由一个字符串name和一个整数count构成。 : 向量vsn已排好序。因为remove删不掉。就想用pop_back删。 : while( vsn.end().count < 2 ) vsn.pop_back(); : //将向量里元素中count值小于2的元素,删除。 : 编译时,总抱错。 : error: âclass __gnu_cxx::__normal_iterator: allocator > >â has no member named âcountâ : while( (vsn.end()).count < 2 ) vsn.pop_back(); : while( *(vsn.end()).count < 2 ) vsn.pop_back();
| d*****a 发帖数: 110 | 5 老大总结的好,这个已经是标准了:
vsn.erase(remove(vsn.begin(), vsn.end(), your_condition), vsn.end());
这个condition怎么做呢,一个简单易行的办法是把要抹掉的元素在loop中用0代替,然
后用用以下作为condition
static_cast(0)
【在 t****t 的大作中提到】 : while (!vsn.empty() && vsn.back().count<2) vsn.pop_back(); : 因为你不能保证vsn.back()总是存在, 所以你要先看它是不是空的. : 如果你知道一个iterator a, 要从这个iterator一直删到最后, 可以写 : vsn.erase(a, vsn.end()); : std::remove不是删除元素用的, 是把要删的元素交换到range的最后. 删除用 : container.erase(). 所以对于vector, 可以这样用: : vsn.erase(remove(vsn.begin(), vsn.end(), your_condition), vsn.end()); : 这些在effective STL里都有...STL虽然很容易用, 但是完全不看手册光凭函数名想当 : 然, 也是不行的.
| l***e 发帖数: 480 | 6 effective STL, do you e-doc to share with me? thanks. | p****x 发帖数: 707 | 7 http://www.avsnonline.net/library/download.php?id=623
【在 l***e 的大作中提到】 : effective STL, do you e-doc to share with me? thanks.
| t****t 发帖数: 6806 | 8 买一本也没几个钱...
【在 l***e 的大作中提到】 : effective STL, do you e-doc to share with me? thanks.
| l***e 发帖数: 480 | 9 感谢。
另外。就是有没有好的书推荐,讲STL。
主要关于如何用这些容器,自定义各种运算。
每个逻辑依赖哪个运算。
我手上有几本书名都是有关STL的。可是,基本元素很多都是整数.
等到自己用结构作元素类型时,不知该定义哪个运算。
当然,有电子版最好。 |
|