For example, if I want to make the assignment
std::vector<int> a;
std::vector<std::pair<std::string, int>> b;
a = b; // a takes all the second components of the pairs in b
Is such a custom assignment possible?
CodePudding user response:
What you seem to want is to transform one container to another. This is usually done with the suitably named std::transform standard function:
std::vector<int> a(b.size()); // Set as same size as the source vector
std::transform(begin(b), end(b), begin(a), [](auto const& pair)
{
return pair.second; // Use the second value of each pair from the source
});
CodePudding user response:
Can you overload = to get a = b; push all elements second to a ?
No. Other issues with overloading operators for std types aside, = can only be implemented as member function. You cannot add a member to std::vector<int>.
Can you overload = to get a = b; push all elements second to a ?
Yes. You cannot overload = for std::vector, but you can overload it for a different type:
#include <vector>
#include <utility>
#include <string>
struct pick_second_vector_ref {
std::vector<int>& t;
template <typename Source>
void operator=(const Source& s) {
for (const auto& e : s) {
t.push_back(e.second);
}
}
};
int main() {
std::vector<int> a;
std::vector<std::pair<std::string, int>> b {{"foo",42}};
pick_second_vector_ref r{a};
r = b; // a takes all the second components of the pairs in b
}
However, this is just to illustrate what happens when taking your question too literally. As often a named function is much clearer than an operator overload that does something unexpected. The above main should rather look something like this:
int main() {
std::vector<int> a;
std::vector<std::pair<std::string, int>> b {{"foo",42}};
copy_second(a,b); // no comment needed here because the code
// explains itself !!
}
...ps...
I used = in many places, and now that I've changed the left vector operand I will have to place the necessary transformation function everywhere I used
=.
Ok. Go for it. Change the code. It will be simple fixes, because all occurences of = in your code are compiler errors. Remember: Code is written once, but read many times. The 5 minutes you spend fixing the = you will save on the long run when readers do not have to wonder what that = actually does (comments should only be needed to explain code when code alone cannot express it clearly, not the case here).
