小编Ker*_*kic的帖子

为什么我可以在 begin() 上使用赋值运算符,即使它是一个右值?

一段时间以来,我似乎无法解决这个特定问题。例如,如果我有以下代码:

void foo(std::vector<int>::iterator &it) {
    // ...
}

int main(){
    std::vector<int> v{1,2,3};
    foo(v.begin());
}
Run Code Online (Sandbox Code Playgroud)

我会得到编译错误:

initial value of reference to non-const must be an lvalue.
Run Code Online (Sandbox Code Playgroud)

我的猜测是我收到错误,因为a.begin()返回了一个右值。

如果是这样,以下表达式怎么可能起作用:

v.begin()=v.begin()++;
Run Code Online (Sandbox Code Playgroud)

如果v.begin()是右值?

c++

4
推荐指数
1
解决办法
110
查看次数

使用来自算法的插入函数在空容器中插入元素未给出预期结果

我正在做一些作业,其中包括一个具有许多方法和构造函数的通用类,但我只对以下构造函数感兴趣,我从初始化列表中取出元素并将它们放入我的容器中:

template <typename T, template <typename...> class Container = std::vector>
class Tok{
    Container<T> collection;
    public:
    Tok(std::initializer_list<T> list);
}
Run Code Online (Sandbox Code Playgroud)

我们被告知我们不能使用算法中的 push_back 函数,而只能使用算法中的插入函数插入元素。首先我实现了这样的构造函数:

template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
auto it2=collection.end();
    for(auto it1=list.begin(); it1!=list.end(); it1++) {
        {collection.insert(it2,*it1); it2++;}
    }
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用,程序崩溃并抛出内存错误。然后我对其进行了一些更改,并使用下一个实现使其工作:

template <typename T, template <typename...> class Container>
Tok<T,Container>::Tok(std::initializer_list<T> list){
    for(auto it=list.begin(); it!=list.end(); it++) 
        collection.insert(collection.end(),*it);
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是为什么第一个不起作用,这两者之间有什么区别?(我使用开始而不是结束得到相同的结果)

c++ containers templates

1
推荐指数
1
解决办法
58
查看次数

标签 统计

c++ ×2

containers ×1

templates ×1