Как вернуть парную ссылку на данные в пользовательском контейнере? - PullRequest
2 голосов
/ 04 апреля 2011
#include <cstdint>
#include <utility>

class SimpleMap {
 public:
  typedef std::pair<const uint32_t, const uint32_t> value_type;
  static const int SIZE = 8;
  uint64_t data_[SIZE];
  SimpleMap() { data_ = {0}; }
  // Returning a reference to the contained data.
  uint64_t const& GetRawData(size_t index) {
    return data_[index];
  }
  // Would like to return a pair reference to modified data, but how?
  // The following wont work: returning reference to temporary
  value_type const& GetData(size_t index) {
    return value_type(data_[index] >> 32, data_[index] & 0xffffffff);
  }
};

Контейнеры, такие как map, имеют итераторы, которые возвращают ссылку на пару. Но как это вообще работает? Если я пишу итератор в контейнер, мне нужно вернуть ссылки на значения. Но как мне это сделать, если значения в парах? А что, если мне нужно немного изменить данные при создании этой пары, как в примере выше?

Надеюсь, мой вопрос не слишком запутан. Пожалуйста, помогите!

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

Вы не храните пары, поэтому не можете вернуть ссылку на сохраненную пару.Вместо этого верните значение.

Если ваш массив был value_type data_[SIZE];, вы, конечно, могли бы возвращать ссылки на эти пары - тогда вам нужно будет построить uint64_t для GetRawData по требованию и вернуть , что в качестве значения, а не ссылки.

3 голосов
/ 04 апреля 2011

Если вы возвращаете измененные данные (а не что-то, хранящееся непосредственно в контейнере), вы не можете вернуть ссылку.

1 голос
/ 04 апреля 2011

Здесь, посмотрите std :: pair .На карте пара представляет собой отображение ключа на значение:

std::pair<KeyType,ValueType>

Таким образом, вы можете получить доступ к значению с помощью:

ValueType value = pairPtr->second;
// or
ValueType value = pair.second;

Возвращая ссылки на значение, чтобы изменить позжепрост, вот пример:

const size_t arSize = 8;
pair<int,int> arrr[arSize];

int& value = arrr[0].second;

value = 9;

int returnedValue = arrr[0].second;//you'll notice this equals 9
...