1 Востаннє редагувалося Teg Miles (14.07.2024 08:54:42)

Тема: Видалення дублікатів із вектора

Видаляю дублікати з вектора ось так:

#include <algorithm>
#include <iostream>
#include <ostream>
#include <vector>

using namespace std;

int main() {
  vector<int> nums{3, 2, 1};
  sort(nums.begin(), nums.end());
  auto it = unique(nums.begin(), nums.end());
  nums.erase(it, nums.end());
  if (nums.size() < 3) {
    cout << nums[nums.size() - 1] << endl;
  }

  cout << nums[3] << endl;
  return 0;
}

А коли хочу поглянути на третій елемент видає нуль.
Чому так? Мало б показувати трійку, як я розумію.
P.S.
Забув про індекси:). Треба, щоб була двійка.

2

Re: Видалення дублікатів із вектора

1. Не робіть using namespace std, це антипатерн.
2. Останній елемент легше брати за допомогою back()
3. <ostream> після <iostream> не потрібен (і взагалі тут не потрібен)
4. Ви все одно не перевіряєте на порожність. Я розумію, що в цьому випадку це не потрібно, але в мене серце кров'ю обливається від nums.size()-1 без перевірки, що nums.size()>0.

std::sort(nums.begin(), nums.end());
auto it = unique(nums.begin(), nums.end());
nums.erase(it, nums.end());
if(nums.is_empty())
    std::cout << "Empty vector";
else if(nums.size()<2)
    std::cout <<nums.back();
else
    std::cout <<nums[2];

3

Re: Видалення дублікатів із вектора

koala написав:

1. Не робіть using namespace std, це антипатерн.
2. Останній елемент легше брати за допомогою back()
3. <ostream> після <iostream> не потрібен (і взагалі тут не потрібен)
4. Ви все одно не перевіряєте на порожність. Я розумію, що в цьому випадку це не потрібно, але в мене серце кров'ю обливається від nums.size()-1 без перевірки, що nums.size()>0.

std::sort(nums.begin(), nums.end());
auto it = unique(nums.begin(), nums.end());
nums.erase(it, nums.end());
if(nums.is_empty())
    std::cout << "Empty vector";
else if(nums.size()<2)
    std::cout <<nums.back();
else
    std::cout <<nums[2];

1. Я в курсі, просто не хотілося зайвий раз std писати для такої маленької програми.
3. Це автододавалка вирішила чомусь, що без <ostream> ніяк:). Треба її вимкнути.
4. Там за умовою завдання вектор непорожній, мінімум один елемент, тому вирішив не перевіряти.

4

Re: Видалення дублікатів із вектора

Залишу це тут для тих, кому лише поглянути

template<typename T> int print_vec(std::vector<T> &v) {
    std::cout << "{";
    if (size_t vs = v.size()) {
        std::cout << v.at(0);
        for (size_t i = 1; i < vs; i++) {
           std::cout << ", " << v.at(i);}}
    std::cout << "}";  
    return 0;}