1

Тема: Видалення однакових стрічок vector<string>

Пробував код від ШІ

#include <algorithm>
#include <vector>

bool equals(const std::string& lhs, const std::string& rhs) {
    return lhs == rhs;
}
std::vector<std::string> remove_duplicates(std::vector<std::string> words) {
    std::vector<std::string> result;
    std::unique_copy(words.begin(), words.end(), std::back_inserter(result), equals);
    return result;
}

не працює.

2

Re: Видалення однакових стрічок vector<string>

Використання ШІ не скасовує використання власного І.
Ви намагалися зрозуміти, що саме вам видав ШІ? Ви прочитали опис функції unique_copy?
Якісь власні думки стосовно алгоритму видалення маєте?

Подякували: leofun011

3

Re: Видалення однакових стрічок vector<string>

Маю думку, яка здається поганою. І код не компілюється

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector <string> del_equal(vector <string> words)
{
    vector <string> tmp=words;
    for(int i=0; i<tmp.size(); i++)
    {
        for (int j=i+1; j<tmp.size(); j++)
            if(tmp[i]==tmp[j]) tmp[j]="ZZZZZZ";//or ЯЯЯЯЯЯ
    }
    sort(tmp.begin(), tmp.end());
    for(int i=0; i<tmp.size(); i++)
    {
        if(tmp[i]=="ZZZZZZ") tmp.erase(i);//or ЯЯЯЯЯЯ
    }
    return tmp;
}
int main()
{
    vector<string> words{ "school", "school", "car", "car" , "apple" };
    vector<string> words2=del_equal(words);
    for (int i=0; i<words2.size(); i++) cout << words2[i] << endl;
}

4

Re: Видалення однакових стрічок vector<string>

Це не думка, це код.
Перед тим, як писати код, ви маєте скласти - хоча б у голові - алгоритм. Якщо ви пишете навмання, а потім перевіряєте, чи не вийшло щось правильно, то у вас очевидно виходитиме неправильно.

v002002 написав:

І код не компілюється

Коли бачиш таке, дуже хочеться спитати: кнопку "скомпілювати" натискали?
Не описуйте те, чого не відбувається; описуйте, що відбувається натомість. Ви отримали повідомлення про помилку, яке не розумієте? Яке саме повідомлення?

5 Востаннє редагувалося koala (12.02.2024 15:29:38)

Re: Видалення однакових стрічок vector<string>

Наскільки я бачу з коду, алгоритм, який ви склали, виглядає приблизно так:
1. перевірити всі пари стрічок в масиві; якщо якась пара однакова - замінити другу стрічку з двох на ZZZZZZZZZ.
2. відсортувати масив
3. видалити всі стрічки, що дорівнюють ZZZZZZZZZ (ця частина ще й неправильно написана)
Одразу питання: нащо видаляти в п.3, а не в п.1 замість заміни? І нащо сортувати?

6

Re: Видалення однакових стрічок vector<string>

Не хочу витрачати час життя. Міг би почати вчити C++, але (з досвіду) його увесь не запам'ятаю і не зрозумію. Шукаю готове рішення. З іншого форума

std::set<std::string> LoadFile(string FileName) {
    std::set<std::string> result;
    std::ifstream inputFile(FileName.c_str());
    if(inputFile)
    {
       string temp;
       while(inputFile >> temp) 
           result.insert(temp);
       inputFile.close();
    }
    return result;
}

Але потрібно не

std::set<std::string> LoadFile

, а

std::vector<std::string> LoadFile

Якщо можете будь-ласка допоможіть

7

Re: Видалення однакових стрічок vector<string>

А, чому тоді користувачі цього форуму мають витрачати свій час, щоб допомогти вам? Ми, звісно, могли б вам надати готове рішення, але (з досвіду) це жодним чином не допомагає тим, хто це просить.
То ж, який сенс нам допомагати вам, якщо для вас, це марна трата часу? Питання риторичне.

Подякували: leofun011

8

Re: Видалення однакових стрічок vector<string>

Якщо на форум зайдуть такі самі люди, які шукають готове рішення (можливо це ви у майбутньому). І це практичне завдання. Ви гуглите чи звертаєтеся до ШІ, чи усе тримаєте в голові? Скільки разів хворіли на грип чи коронавірусом? Мабуть дуже здорові люди, а в мене пам'ять лише деградує

9 Востаннє редагувалося koala (12.02.2024 16:21:48)

Re: Видалення однакових стрічок vector<string>

Вам у будь-якому разі доведеться навчитися користуватися інструментом, який ви хочете використовувати. Якщо у вас немає часу на C++ - беріть Python чи на що там ви маєте час.
На те, щоб досягти результату за допомогою інструменту, яким ви не вмієте користуватися, знадобиться більше часу, за визначенням.

10

Re: Видалення однакових стрічок vector<string>

Я спалився і тому мені більше не допоможуть ні в цьому питанні ні в інших, я правильно розумію? мені Бан за створення мультиакаунта. А я думав ми ШІ створимо

11

Re: Видалення однакових стрічок vector<string>

koala написав:

Вам у будь-якому разі доведеться навчитися

це комусь доведеться навчитися. Я "вчусь" з 2015 року. Скільки я перечитав різних книжок, матеріалів, нічого не зрозумів і усе забув. І не тільки з Сі читав. Ще з анатомії, гістології, фізіології, фармакології, фізики, хімії та багато... Навіщо я витрачав час? Нормальна людина не буде без грошової плати займатися справою. Людина без маній та пристрастей. А людина з маніями і пристрастями не тільки у цьому ненормальна, а і у інтелекті. Якщо він гарний і якщо людина має краплину самосвідомості, то зрозуміло що комп'ютер здоров'я і грошей (за електрику) не додає. Люди купують LED лампочки 5 Вт. Ноутбук 50 Вт. Ну нехай 20 в режимі простою. До того ж за цей час можна робити якусь роботу, за яку отримувати нормальні гроші і не маятися дурнею. Хоча би збирати пластикові пляшки зі сміттєвих баків, якщо нічого іншого не виходить. А якщо інтелект не гарний, як у мене, самосвідомості немає, то і програмуванням займатися важко і доводиться звертатися на форуми постійно. Воно не потрібно, а є якась манія що воно знадобиться, що можна створити платну програму і продати, ще якась дурниця яка ніколи не буде реалізована через повільне написання і важкість коду, який не дойде до чогось толкового.
Я не хочу міряти інтелект учасників форуму, але якщо відповідь не по темі, то не варто було узагалі відповідати.

Комусь доведеться навчитися. Тому, кому це потрібно і у кого є  замовлення і кому дадуть гроші. Займатися чимсь таким, що він може. Як ви правильно сказали "на що маєте час". Тільки насправді "на що маєте інтелект". А я не навчився ні запитувати, ні шукати. 

На те щоб знайти оце:
https://www.geeksforgeeks.org/remove-du … ds-string/
я витратив 5-7 годин. Там правда не зовсім це, але підійде.

12

Re: Видалення однакових стрічок vector<string>

#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
#include <sstream>
vector<string> removeDupWord(string str)
{
    istringstream ss(str);
    vector<string> words;
    unordered_set<string> hsh;
    do {
        string word;
        ss >> word;
        while (hsh.find(word) == hsh.end()) {
            words.push_back(word);
            hsh.insert(word);
        }
 
    } while (ss);
    
    return words;
}

13

Re: Видалення однакових стрічок vector<string>

Ось, будь ласка. Але нащо? Ви ж на наступному завданні теж нічого зробити не зможете.

std::vector<std::string> removeDupWordUnique(std::vector<std::string> strings) //O(n*log(n))
{
    std::sort(strings.begin(), strings.end());
    auto end = std::unique(strings.begin(), strings.end());
    strings.erase(end, strings.end());
    return strings;
}

std::vector<std::string> removeDupWordUnorderedSet(const std::vector<std::string>& strings) //O(n)
{
    std::unordered_set<std::string> unique(strings.begin(), strings.end());
    return std::vector<std::string>(unique.begin(), unique.end());
}

тест

Подякували: v002002, leofun01, steamwater3

14

Re: Видалення однакових стрічок vector<string>

koala, другим аргументом erase треба передати end. Ви так i планували, бо вирахували його зазгелiдь.

15

Re: Видалення однакових стрічок vector<string>

steamwater написав:

koala, другим аргументом erase треба передати end. Ви так i планували, бо вирахували його зазгелiдь.

Не зрозумів?

16 Востаннє редагувалося steamwater (20.02.2024 23:39:55)

Re: Видалення однакових стрічок vector<string>

Не зрозумів?

Ох... Прошу выбачення. Не вдивився. Я це роблю якось так:

    strings.resize(end - strings.begin());

а ви видаляєте з end по strings.end((). То ж моє зауваження - моя помилка. Видалить, будь ласка, якщо є змога. Доречi, чи є тут кнопка редагування?

17

Re: Видалення однакових стрічок vector<string>

Додав вам можливість редагування (закрито для новачків через тролів).
Ну і є таке правило erase-remove.

Подякували: steamwater1

18 Востаннє редагувалося steamwater (21.02.2024 09:38:21)

Re: Видалення однакових стрічок vector<string>

Щире дякую, пане koala) Зараз спробую скористатись, щоб виправити деякi помилки.
ps Ще можу додати, чому менi бiльш до вподоби resize. Метод erase(it1, it2) мабуть достатньо розумный щоб не викликати erase(it) циклiчно. Вiн вiдразу запустить цикл викликiв деструкторiв. Але потiм вiн буде змушений викликати std::copy яка принявши дiaпазон з iтератора end() по end() на объєктi вектора нiчого не буде робити, звicно, але ж виклик буде скомпiльовано, бо перевiрка на те що копiйувати нема що неможлива бо iнакше буде порушено iдiому "не сплачуємо за те що не замовляли". (-: