Как мне найти уникальные слова из вектора и поместить их в другой вектор? - PullRequest
0 голосов
/ 12 апреля 2020

Я пытался сделать эту функцию, но безуспешно. Я только начинаю с ++ и не могу понять это.

vector<string> findUniqueWords(vector<string> vardi){
    vector<string> unikVardi;
    unikVardi.push_back(vardi[0]);
    for (int i = 1; i < vardi.size(); i++){
        for(int k = 0; k < unikVardi.size(); k++){
            if (vardi[i] != unikVardi[k]){
                unikVardi.push_back(vardi[i]);
            }
        }

     return unikVardi;
    }

}

Ответы [ 5 ]

0 голосов
/ 12 апреля 2020

Умные ребята уже разработали в стандартной библиотеке все, что вам может понадобиться. Если вы хотите успешно изучать C ++, вам следует прочитать руководства, которые часто дают хорошие примеры: std :: unique

vector<string> findUniqueWords(vector<string> vardi){
    std::sort(vardi.begin(), vardi.end());
    auto last = std::unique(vardi.begin(), vardi.end());
    vardi.erase(last, vardi.end());
    return vardi;
}
0 голосов
/ 12 апреля 2020

Ссылка std::unique на самом деле имеет пример, чтобы сделать именно это, используя std::sort,

std::vector<std::string> findUniqueWords(std::vector<std::string> vardi)
{
    std::sort(vardi.begin(), vardi.end());
    vardi.erase(std::unique(vardi.begin(), vardi.end()), vardi.end());
    return vardi;
}

Используя библиотеку range-v3 , это становится еще проще,

std::vector<std::string> findUniqueWords(std::vector<std::string> vardi)
{
    return vardi 
           | ranges::move 
           | ranges::actions::sort 
           | ranges::actions::unique;
}
0 голосов
/ 12 апреля 2020

Идея состоит в том, чтобы создать элементы sh только один раз, если их нет в списке результирующих слов. Вы можете использовать al oop, std::count, std::find и др. c. проверить несуществование элементов. Или вы также можете использовать std::unique напрямую.

С al oop это будет примерно так ( live ):

using Words = std::vector<std::string>;

Words findUniqueWords( const Words& words )
{
    Words uniqueWords;
    uniqueWords.push_back( words[0] );

    for ( int i = 1; i < words.size(); ++i )
    {
        bool isAdded = false;
        for ( int j = 0; j < uniqueWords.size(); ++j )
        {
            if ( words[i] == uniqueWords[j] )
            {
                isAdded = true;
                break;
            }
        }

        if ( !isAdded )
        {
            uniqueWords.push_back( words[i] );
        }
    }

    return uniqueWords;
}

Вот пример с std::count ( live ):

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using Words = std::vector<std::string>;

Words findUniqueWords( const Words& words )
{
    Words uniqueWords;
    uniqueWords.push_back( words[0] );

    for ( int i = 1; i < words.size(); ++i )
    {
        if ( std::count( uniqueWords.cbegin(), uniqueWords.cend(), words[i] ) == 0 )
        {
            uniqueWords.push_back( words[i] );
        }
    }

    return uniqueWords;
}

int main()
{
    const Words words { "abc", "xyz", "abc", "xyz", "jkl" };

    const auto result = findUniqueWords( words );
    for ( const auto& word : result )
    {
        std::cout << word << '\n';
    }

    return 0;
}

Вывод:

abc
xyz
jkl

Кроме того, вам необходимо позаботиться о случай, когда вход words является пустым списком.

Соответствующий поток: Почему "используется пространство имен std;" считается плохой практикой?

0 голосов
/ 12 апреля 2020

Он должен вернуться с одним элементом unikVardi с первым элементом vardi

Вы нажимаете первый элемент с этими двумя строками:

vector<string> unikVardi;
unikVardi.push_back(vardi[0]);

Теперь вы сравнивая с этими двумя vector

 for (int i = 1; i < vardi.size(); i++){

    // unikVardi.size() == 1

     for(int k = 0; k < unikVardi.size(); k++){
        if (vardi[i] != unikVardi[k]){
          unikVardi.push_back(vardi[i]);
     }
 }
 return unikVardi;

После одной итерации он go вернется к вызывающей станции. :-P

См. С main ():

#include <iostream>
#include <bits/stdc++.h>
#include <string>

using namespace std;

vector<string> findUniqueWords(vector<string> vardi){


    vector<string> unikVardi;
    unikVardi.clear();


    unikVardi.push_back(vardi[0]);


    for (int i = 1; i < vardi.size(); i++) {
        for(int k = 0; k < unikVardi.size(); k++) {

        cout<<vardi[i]<<" Outside:  "<<unikVardi[k]<<endl;
            if (vardi[i] != unikVardi[k]){
                cout<<vardi[i]<<" "<<unikVardi[k]<<endl;
                unikVardi.push_back(vardi[i]);
            }
        }

     return unikVardi;
    }

}

int main()
{
    vector<string> g1, g2;
    string str = "This";

    for (int i = 1; i <= 5; i++)
        g1.push_back(str);

    g2 = findUniqueWords(g1);

    for (int i = 0; i < g2.size(); i++)
        cout<<g2.size()<<endl;
    return 0;
}

Это даст вам This, потому что он имеет только один элемент. Этот элемент равен vardi[1] второму элементу. Таким образом, он не будет go до if l oop. Вернемся к main() с одним элементом.

Надеюсь, теперь вы поймете, что происходит в вашей функции.

0 голосов
/ 12 апреля 2020

вы должны написать что-то вроде этого:

vector<string> findUniqueWords(vector<string> vardi){
vector<string> unikVardi;
unikVardi.push_back(vardi[0]);
for (int i = 1; i < vardi.size(); i++){
    bool unique = true;
    for(int k = 0; k < unikVardi.size(); k++){
        if (vardi[i] == unikVardi[k]){
           unique  = false;
        }
    }
    if(unique)    unikVardi.push_back(vardi[i]);

}
return unikVardi;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...