C++中vector为空时的一个疑惑,望出手相救

C++中vector为空时的一个疑惑,望大虾出手相救。
本帖最后由 maomaocaonima 于 2015-01-27 10:11:54 编辑
1  问题出处:《C++ Primer 中文版(四)》,P83.
2  题目:“列出三种定义vector对象的方法,给定10个元素,每个元素值为42.”
3  所给一种解答:
    vector<int> ivec;
    vector<int>::iterator iter = ivec.end();  // ①
    for ( int i= 0;  i != 10;  ++i)  {
         ivec.insert(iter,42);        //②
         iter=ivec.end;
}


4  疑问:                                                                                                                                                        
    1.>>定义一个空的容器,ivec.end和ivec.begin的返回值相同吗?如果不同,分别是什么?
    2.>>在语句①中,iter是指ivev的第一个元素ivec[0]吗?

------解决思路----------------------
引用:
你的for循环中最后一句写错了,应该是:iter = ivec.end();

ivec.end()返回的是一个最后一个元素的下一个元素的地址,该地址是空的

也就是说,vector<int> ivec的元素是从ivec.begin()开始,到ivec.end()-1结束

如果vector<int> ivec中没有元素,ivec.begin()和ivec.end()都是空指针

这不是空指针,

std::vector::begin()
Returns an iterator to the first element of the container.
If the container is empty, the returned iterator will be equal to end(). 

std::vector::end()
Returns an iterator to the element following the last element of the container.
This element acts as a placeholder; attempting to access it results in undefined behavior. 



------解决思路----------------------
引用:
Quote: 引用:

对于空容器应该,相同啊,
0个元素的vector 
最后一个元素是 ivec[-1];
第一个元素是 ivec[0];
这个ivec是个空容器,里面没有一个元素,
所以这第一个元素 ivec[0]
不属于空容器ivec
所以 空容器ivec,中 ivec.begin ()== ivec.end()


十分感谢你的回答。
刚开始学C++,可以帮我解释一下语句②吗?
如果是空容器,是怎么把元素(10个42)用insert放进去的?
再次感谢。


#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

int
main(int argc, char *argv[])
{
    vector<int> v;

    v.insert(v.end(), 10, 42);

    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}

------解决思路----------------------
引用:
1  问题出处:《C++ Primer 中文版(四)》,P83.
2  题目:“列出三种定义vector对象的方法,给定10个元素,每个元素值为42.”
3  所给一种解答:
    vector<int> ivec;
    vector<int>::iterator iter = ivec.end();  // ①
    for ( int i= 0;  i != 10;  ++i)  {
         ivec.insert(iter,42);        //②
         iter=ivec.end;
}


4  疑问:                                                                                                                                                        
    1.>>定义一个空的容器,ivec.end和ivec.begin的返回值相同吗?如果不同,分别是什么?
    2.>>在语句①中,iter是指ivev的第一个元素ivec[0]吗?

1、相同,我们通常写代码都会这样:

for(vector<int>::iterator iter = xx.begin(); iter != xx.end(); ++ iter)
{
...
}

这个写法很熟悉吧,空就不执行内部代码

2、不是,因为压根就没有ivec[0]
------解决思路----------------------
 ivec.insert(iter,42);//在迭代器的位置插入元素(42),这个迭代器是 ivec.end(); 即在尾部插入元素

insert  有很多版本,这个版本,只是插入一个元素。
另外这里有个笔误


vector<int> ivec;
    vector<int>::iterator iter = ivec.end();  // ①
    for ( int i= 0;  i != 10;  ++i)  {
         ivec.insert(iter,42);        //②
         iter=ivec.end();//这里少了括号,这个笔误,也许是你的抄写错误
         //iter=ivec.end;
}