使用迭代器范围将单个元素附加到容器

Ori*_*ent 2 c++ containers iterator stl

我想(复制)将单个元素附加到某个(类似STL的)容器,但我可以使用的是basic_string & append(InputIt first, InputIt last)-like接口来初始化或将元素附加到容器.

执行以下操作是错误的:

#include <vector>

struct container
{

    template< typename input_iterator >
    void init(input_iterator const beg, input_iterator const end)
    {
        v.insert(v.cend(), beg, end);
    }

    template< typename input_iterator >
    void append(input_iterator beg, input_iterator const end)
    {
        while (beg != end) {
            v.push_back(*beg);
            ++beg;
        }
    }

private:
    std::vector< int > v;
};

#include <cstdlib>

int main()
{
    int i = 123;
    container c;
    c.init(&i, &i + 1);
    int j = 555;
    c.init(&j, &j + 1);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

具体来说,我担心f(&i, &i + 1)结构是否有效(假设一元operator &不会超载)?

Bar*_*rry 6

是的,它完全有效.来自[expr.unary.op]:

出于指针运算(5.7)和比较(5.9,5.10)的目的,不是以这种方式获取地址的数组元素的对象被认为属于具有一个类型元素的数组T.

&i + 1 简单地指向一个超过该对象结尾的对象,为此目的是一个超过该类型的第一个数组的结尾,根据[expr.add],这是一个完全合法的引用:

如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.


作为旁注,你的append()函数是一个严格更糟糕的init()函数实现.

  • @TemplateRex`for(auto x:single_var){...}`会很有趣...... (2认同)