lebed2045
lebed2045

Reputation: 468

how can I copy vector in c++ by reference O(1)?

I want to have class scope alias to the vector from an argument.

For exapmale:

class Solution {
private:
     vector<int> b; // I want that &b = a, where a from function solve
     int f(int i) {
          // here I want to use vector<int> a, 
          // not passing it as a function argument every time
     }
public:
     int solve(vector<int>& a) {
          // here I want to do smth like b = a; which works for O(1)
     }
};

Unfortunatelly, I can't just declare vector<int> &b; , because of the error: declaration of reference variable 'b' requires an initializer

Could you please, explain how to do it in C++11/14?

Update: I can't change the declaration of int solve(vector<int>& a), the interface provided from outside.

Update: I've changed the code to the more explicit. Looks like I shouldn't do again because in answers and comments people use original variable names. I'm sorry, don't have much experience with StackOverflow.

Upvotes: 5

Views: 14744

Answers (1)

Xeren Narcy
Xeren Narcy

Reputation: 875

Maybe this?

class Solution {
public:
     vector<int> a;
     int maxCoins(const vector<int>& _a) { // const because copying
          a.assign( _a.begin(), _a.end() );
     }
};

But know that you can also do this if you want a reference to the original vector<int> rather than a copy:

class Solution {
public:
     vector<int> & a;
     int maxCoins(vector<int>& _a) : a( _a ) {}
};

Update

This is probably closest. You cannot re-initialize a reference, but then this is exactly the use-case for pointers.

class Solution {
public:
     vector<int> * a;
     int f(int i) {
         a->size(); // can access indirectly
         (*a)[1]; // element access is slightly trickier
         vector<int> & _a = *a; // or can create a direct ref
         _a.size();
     }
     int solve(vector<int>& _a) {
         a = &_a; // store address to _a. a reference is like any local variable unless doing something funny
     }
};

Update 2 - using no pointers

#include <functional>

class Solution {
public:
     // vector<int> a;
     typedef vector<int> datatype;
     datatype blankref;
     std::reference_wrapper<datatype> a = blankref;
     int f(int i) {
          vector<int> & _a = a;
     }
     int solve(vector<int>& _a) {
          a = std::ref(_a);
     }
};

You can't avoid the fact that references are assign-once. References in a class instance have to be assigned using initializer syntax. To have a re-usable reference, you need to have a newly initialized object each time.

To help us here, thanks to advice in comments, there is std::reference_wrapper<T> type that can hold instances of references. It can be assigned to using std::ref( _a ) repeatedly.

Honestly pointers are not inelegant when used right, imo. It comes down to use case and what you believe you would need. Performance wise this probably won't be as good as with pointers (because of temporary objects being constructed), though no guarantees... it should perform similarly in any case.

Upvotes: 5

Related Questions