Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

c++ - std::vector::erase(item) needs assignment operator to be defined for item?

I have a class C which does not define operator=. I have am trying to use a vector like so: std::vector<std::pair<C,D>> vec;. Now, my problem is that I am not able to erase the pair after I am done with it. The compiler complains of missing operator= for C. Can I not have a vector of a class which does not have this operator? How do I get around this? I cannot add assignment to C. This is the error I get:

error C2582: 'operator =' function is unavailable in 'C'    C:...includeutility  196 1   my-lib

This is my code:

void Remove(const C& c) 
{
    auto i = cs_.begin();
    while( i != cs_.end()) {
        if (i->first == c) {
            cs_.erase(i);  // this is the problem
            break;
        }
        i++;
    }
 }

where cs_ is:

std::vector<std::pair<C,D>> cs_;
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The reason is that erase will reallocate your objects if you erase a different position than std::vector::end(). A reallocation implicates copying.

Notice that a vector of an uncopyable type is only partially useable. Before we had emplace() (pre-C++11) it was even impossible. If your class is however copyable, why dont you define an assignment operator then?

A workaround could be a vector of smartpointers (or normal pointers) like std::vector<std::unique_ptr<C>>


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...