C возвращает коллекцию по значению

#c #collections

#c #Коллекции

Вопрос:

Я хочу сделать свою коллекцию неизменяемой за пределами моего класса.

из этого:

 public:    
    vector<int>amp; getValues(){
        return values;
    }
private: 
    vector <int>amp; values;
  

к этому:

 public:    
    vector<int> getValues(){
        return values;
    }
private: 
    vector <int>amp; values;
  

Будет ли это работать нормально?

Комментарии:

1. Вы пробовали это? это легко сделать…

2. Вы уверены, что вам нужен ссылочный элемент?

3. Использование ссылки в качестве метода-члена не является неправильным , но это также необычно, и это не сулит ничего хорошего с «Я хочу сделать мою коллекцию неизменяемой за пределами моего класса » . Ссылка там подразумевает, что коллекция не принадлежит классу. Мое первое предположение заключается в том, что вы не хотите хранить ссылку, но без дополнительного кода или более полного описания я просто оставляю комментарий, чтобы вы подумали об этом.

Ответ №1:

Это сработает, но вам было бы лучше вернуть постоянную ссылку:

 const vector<int> amp; getValues() const {
    return values;
}
  

Кроме того, сохранение ссылки в классе часто (не всегда) является ошибкой. Вероятно, вам нужно значение или, возможно, указатель.

Ответ №2:

Да, но это может оказать негативное влияние на производительность, если коллекция большая, а функция вызывается часто. Что плохого в том, чтобы просто вернуть vector<int> constamp; (и объявить getValues() const )?

Кроме того, меня интересует тот факт, что ваш элемент является ссылкой. Члены редко должны быть ссылками.

Ответ №3:

 public:    
    vector<int> getValues(){
        return values;
    }
private: 
    vector <int>amp; values;
  

Невозможно работать как есть, на что на самом деле ссылается ссылка на ваш вектор? Если вы не показываете здесь весь код, это не сработает.

Вместо этого просто используйте vector<int> values; .

Комментарии:

1. Возможно, это не очень хорошая идея, но она работает, если ссылка инициализирована в классе ctor.

2. Очевидно, что он показывает не весь код, поскольку класс со ссылочным членом требует (всегда) пользовательского конструктора. Я сам скептически отношусь к ссылочному члену, но это не имеет ничего общего с его фактическим вопросом.

3. но то, что я говорю, не является технически неправильным? Я не понимаю понижения,

4. 1, у меня была та же догадка: я полагаю, что это ошибка в коде, поскольку описание, похоже, указывает, что класс владеет коллекцией, и эта ссылка, похоже, подразумевает обратное, где кажется , что есть уродливые угловые случаи: type() : values( *new vector<int> ) {}; ~type() { delete amp;values; } но если это используется … это проблема сама по себе!

5. Спасибо за обсуждение, ребята 🙂

Ответ №4:

Да, вы можете это сделать, но это не обязательно то, что вы хотите.

Делая это, ваш метод getValues создаст копию вектора. Это займет некоторое время (в зависимости от размера вектора).

Если вы уверены, что вектор не часто меняется, почему бы не вернуть постоянную ссылку, например:

 const vector<int> amp;getValues() {return values;}
  

Ответ №5:

возвращает pair из const_iterators , тогда вызываемый объект также абстрагируется от базового контейнера…

например

    typedef std::vector<int> vector_type;
public:
   typedef std::pair<vector_type::const_iterator, vector_type::const_iterator> range;

   range getValues() const
   {
     return range(values.begin(), values.end());
   }
private:
   vector_type values;