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

标签: vector
65人阅读 评论(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);'
查看评论

细细品味ASP.NET (二)

细细品味ASP.NET (二)青苹果工作室(编译) 01-5-17 下午 01:33:55Web表单 ASP.NET Web Forms就是Web页面,同现在你用 ASP编写代码所做的工作是一样的。...
  • tchaikov
  • tchaikov
  • 2001-05-17 18:50:00
  • 982

[C++]高效使用c++11的一些建议

Modern C++Modern C 区别 和 使用nullptr而不是null 和 0 使用别名声明而不是typedef 使用有作用域的enum 不希望被使用的函数要定义为delete 声明ove...
  • stary_yan
  • stary_yan
  • 2016-07-27 16:51:10
  • 1549

RTTI机制与作用

一、RTTI(Run-Time Type identification),通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。面向对象的编程语言,想C++,...
  • gogoky
  • gogoky
  • 2016-05-04 21:15:30
  • 2745

Android中动态添加╱删除的Spinner菜单

实现步骤: 第一步:建立Android 工程:SpinnerDemo。                                                                 ...
  • windone0109
  • windone0109
  • 2010-03-08 15:13:00
  • 2558

vector::erase()函数调用出错问题

vector::erase()函数调用出错问题 vector::erase()方法有两种重载形式 iterator erase(   iterator _Where);//删除某个元素 ...
  • shuixiaowei0530
  • shuixiaowei0530
  • 2017-09-04 21:30:06
  • 118

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

vector v; v.pushback(0); v.pushback(1); v.pushback(1); v.pushback(0); 想要删除值为1的元素 错误代码  vecto...
  • zzuchengming
  • zzuchengming
  • 2016-03-15 13:05:47
  • 3651

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

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

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

vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( ...
  • Xiaohei00000
  • Xiaohei00000
  • 2015-10-24 09:23:33
  • 9185

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

通过vector我们可以减少类里的变量,比如一个类里存储了一个数据但是不知道这个数据到底要存储个,我们常常使用结构体数组加一个变量来记录存储记录的数量,但是通过vector可以简化这个变量,因为vec...
  • u010003835
  • u010003835
  • 2015-08-11 15:11:58
  • 1574

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

vector::clear()函数的作用是清空容器中的内容,但并不回收内存,但你可以通过一下...
  • a18826408828
  • a18826408828
  • 2014-07-17 21:54:34
  • 7938
    个人资料
    持之以恒
    等级:
    访问量: 37万+
    积分: 9445
    排名: 2418
    我的链接
    最新评论