2

我正在尝试从迭代器对创建一个 stl 向量,但我不确定该向量可能有多少元素。它可能只有一个元素。

#include <iostream>
#include <vector>

int main()
{
    using namespace std;

    vector<int> vect;
    for (int nCount=0; nCount < 6; nCount++)
        vect.push_back(nCount);

    vector<int> second(vect.begin(), vect.begin() );

    vector<int>::iterator it; // declare an read-only iterator
    it = second.begin(); // assign it to the start of the vector

    while (it != second.end()) // while it hasn't reach the end
    {
        cout << *it << " "; // print the value of the element it points to
        it++; // and iterate to the next element
    }

    cout << endl;
}

我认为向量“第二个”将有一个由 vect.begin() 指向的元素。不是这样吗?

谢谢

4

3 回答 3

8
vector<int> second(vect.begin(), vect.begin() + 1);

矢量构造函数使用开区间,因此不包括结尾,即。[first, last)

正如唇在他的评论中指出的那样,它更通用next

second(vect.begin(), next(vect.begin()));
于 2013-07-02T14:17:26.423 回答
3

不,事实并非如此。文档很清楚:

template< class InputIt > 
vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() ); (4)    

4) 用范围 [first, last) 的内容构造容器。

符号“[first, last)”表示复制了介于两者first之间last但不包括在内的所有元素。last由于first== last,没有元素被复制。

进一步阅读文档,您似乎可以使用另一个构造函数:

explicit vector( size_type count, 
                 const T& value = T(),
                 const Allocator& alloc = Allocator());  (until C++11)
         vector( size_type count, 
                 const T& value,
                 const Allocator& alloc = Allocator());  (since C++11)

...这样:

vector<int> second(1, vect.front());
于 2013-07-02T14:22:26.763 回答
2

不。在构造函数中,第二vector<int> second(vect.begin(), vect.begin());迭代器应该指向末尾,所以你得到完全空的数组。

示例:vect.end()点正好超过vector的末尾vect,因此vector<int> second(vect.begin(), vect.end());将整个复制vectsecond.

于 2013-07-02T14:17:38.720 回答