关闭

C++ vector::erase和无参构造函数的调用

标签: vector
28人阅读 评论(0) 收藏 举报
分类:

vector::erase

C++ vector的元素删除,源码是这样的:

template <class _Tp, class _Allocator>
inline _LIBCPP_INLINE_VISIBILITY
typename vector<_Tp, _Allocator>::iterator
vector<_Tp, _Allocator>::erase(const_iterator __position)
{
#if _LIBCPP_DEBUG_LEVEL >= 2
    _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__position) == this,
        "vector::erase(iterator) called with an iterator not"
        " referring to this vector");
#endif
    _LIBCPP_ASSERT(__position != end(),
        "vector::erase(iterator) called with a non-dereferenceable iterator");
    difference_type __ps = __position - cbegin();
    pointer __p = this->__begin_ + __ps;
    this->__destruct_at_end(_VSTD::move(__p + 1, this->__end_, __p));
    this->__invalidate_iterators_past(__p-1);
    iterator __r = __make_iter(__p);
    return __r;
}

可知,C++将被删除部分的后面所有元素作为一个集合向前移动了。
所以,假设我们需要清空元素,不要这样写:

int main()
{
    vector<int> v_int;
    for(int i=0;i<10;i++){
        v_int.push_back(i+1);
    }
    int size = v_int.size();
    vector<int>::iterator it = v_int.begin();
    while(size--) {
        cout<<*it<<" ";
        v_int.erase(it++);   // attention !
        cout<<"size: "<<v_int.size()<<endl;
    }
    return 0;
}

它得到结果是这样的:

1 size: 9
3 size: 8
5 size: 7
7 size: 6
9 size: 5

将例子中的it++改成it即可,那样才能清空所有的元素。

无参构造函数的调用

形如Base instance()会调用类的无参构造函数吗?
答案是否定的,C++会将其解释成返回Base对象的函数。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class Base{
public:
    Base(){ cout<<"Base()..\n"; }
    Base(string str){ cout<<str<<endl; }
    ~Base(){ cout<<"~Base().. \n"; }
};

int main()
{
    //Base ins(); //empty parentheses interpreted as a function declaration
    Base ins;     //ok
    Base ins2("hello world");  //ok
    return 0;
}

不过有意思的是,有参构造函数却是可以被这样调用的。

有时,我们会遇到这样的函数:

void show(const Base &b){
    //...
}

需要给该函数传递一个存储在栈中的变量,要构造这样的变量,我们可以简单地这样写Base(). 它等价于Base b.
即:

    //show(Base("hello"));  //ok. output: hello     it's equal to 'Base b("hello"); show(b);'
    //show(Base());         //ok. output: Base()..  it's equal to 'Base b; show(b);'
0
0
查看评论

C++中Vector的erase()操作以及与remove的区别

vector v; v.pushback(0); v.pushback(1); v.pushback(1); v.pushback(0); 想要删除值为1的元素 错误代码  vector::iterator itr = v.begin();   ...
  • zzuchengming
  • zzuchengming
  • 2016-03-15 13:05
  • 2654

C++/STL_中vector基本操作测试代码,vector.erase()使用方法

通过vector我们可以减少类里的变量,比如一个类里存储了一个数据但是不知道这个数据到底要存储个,我们常常使用结构体数组加一个变量来记录存储记录的数量,但是通过vector可以简化这个变量,因为vector里面有通用的size方法可以帮我们完成这个操作。 测试代码: #include #inc...
  • u010003835
  • u010003835
  • 2015-08-11 15:11
  • 1443

vector.erase()用法介绍及注意事项;

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(   iterator _Where); 删除指定位置的元素,返回值是一个迭代器,指向删除...
  • Xiaohei00000
  • Xiaohei00000
  • 2015-10-24 09:23
  • 7987

注意 c++ vector中的erase()

#include #include vector> using namespace std;   int main() {     vectorint> arr;  ...
  • zhuimengzh
  • zhuimengzh
  • 2011-10-03 09:58
  • 19993

C++ vector容器erase操作后iterate失效真相

在使用STL Vector容器时,大家一定遇到进行erase操作后,迭代器会失效的现象。网上很多文章解释说,是因为Vector的底层是通过数组来实现的,erase之后会造成内存的重新分配,故原容器的迭代器便失效。 我以前也一直这样认为,从来没有深究过,最近在研读《STL 源码剖析》的第四章时,发现如...
  • chenfei0920
  • chenfei0920
  • 2015-07-23 12:39
  • 651

C++学习之路(vector::clear和vector::erase的区别)

vector::clear()函数的作用是清空容器中的内容,但并不回收内存,但你可以通过一下
  • a18826408828
  • a18826408828
  • 2014-07-17 21:54
  • 7242

【C++】vector容器和list容器中使用单个迭代器的erase函数学习笔记

例题为:假设有如下ia的定义,ia复制到vector和list中,把list容器中奇数值元素删除掉,把vector容器偶数值元素删除掉。 数组复制采用push_back操作。删除操作采用了erase函数,由于该函数返回值为指向被删除元素后面的元素,则使用了返回值赋值回给迭代器的方法,对迭代器进行前移...
  • qazcxh
  • qazcxh
  • 2015-04-11 16:07
  • 1293

vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?

vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次? 分类: C++2011-08-18 14:55 720人阅读 评论(0) 收藏 举报 vectoriteratorexceptiondeletestri...
  • jfkidear
  • jfkidear
  • 2014-11-05 13:54
  • 972

容器中clear()和erase()的区别

 1、vector::clear()函数的作用是清空容器中的内容,但如果是指针对象的话,并不能清空其内容,必须要像以下方法一样才能达到清空指针对象的内容: [cpp] view plaincopyprint? vectorint*> xx; ...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015-05-03 11:05
  • 2889

vector中的删除,erase和remove的小疑惑--【STL】

对于vector容器的使用,平时只是简单的进行遍历查找一下,未曾进行其它操作,这不,今天出了一点差错; earse方法的操作是将此时的节点删除,然后指向被删除节点的下一个: 如对数据1 6 6 4 7;
  • xjm199
  • xjm199
  • 2014-05-01 14:29
  • 2087
    个人资料
    • 访问:355948次
    • 积分:9155
    • 等级:
    • 排名:第2424名
    • 原创:578篇
    • 转载:13篇
    • 译文:0篇
    • 评论:36条
    我的链接
    最新评论