Трюк своп, stl - PullRequest
       49

Трюк своп, stl

0 голосов
/ 25 июня 2018

Конденсатор у нас есть std::vector и мы хотим его составить, сделать его размер == емкость.

  vector<int> V;
  for(int i=0; i<10; ++i)
  {
        V.push_back(i);
  }
  std::cout<<V.size()<<" "<<V.capacity()<<endl;

Таким образом, вывод для этого будет 10 13 (до его реализацииопределил, я использовал VS2017).

Как перераспределить вектор способом, в котором размер == емкость?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Начиная с C ++ 11, существует метод shrink_to_fit() для std::vector.Я бы рекомендовал использовать это, а не трюк подкачки.Однако обратите внимание, что shrink_to_fit() - это запрос, который не может быть удовлетворен реализацией библиотеки.

Это необязательный запрос, чтобы уменьшить емкость () до размера ().От реализации зависит, будет ли выполнен запрос.

Подробнее см. https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

0 голосов
/ 25 июня 2018

Вот трюк, описанный в книге Скотта Мейерса «Эффективный STL».
Трюк называется «сжатый к размеру» или, как его называет автор, Трюк со свопом .

 std::vector<int>(V).swap(V);

Идея очень проста, мы создаем временную копию V, для которой размер == емкость, и сопоставляем ее с фактическим V. Это просто и просто.

  vector<int> V;
  for(int i=0; i<10; ++i)
  {
        V.push_back(i);
  }
  std::cout<<V.size()<<" "<<V.capacity()<<endl;

  std::vector<int>(V).swap(V);

  std::cout<<V.size()<<" "<<V.capacity()<<endl;

Теперь вывод для этого кодаэто:
10 13
10 10

Примечание: этот прием применяется также для std::string and std::deque

...