• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

map nie pobiera wartości z vectora

Object Storage Arubacloud
0 głosów
249 wizyt
pytanie zadane 14 sierpnia 2016 w C i C++ przez 87kelthuzad Obywatel (1,270 p.)

Witam mam pewien problem który wiąże się z tym że nie wiem czemu do map() nie trafiają słowa z vectora (stosuję map pierwszy raz).

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <cstdlib>
#include <cstddef>
#include <map>

using namespace std;

void openFile ( fstream& file );                                //zaladowanie pliku
vector<string> assignment ( fstream& file );                    //przypisanie
vector<string> checkingValues ( vector<string> finishWords );   //sprawdzanie slow
void countingOfWords ( const vector<string>& endChangesWords );        //zliczanie slow


int main()
{
    fstream file;
    openFile( file );
    vector<string> finishWords =  assignment( file );
    vector<string> endChangesWords = checkingValues( finishWords );
    countingOfWords( endChangesWords );
    return 0;
}
//==========================================================================================
void openFile( fstream& file )
{
    file.open( "dane.txt" , ios::in );
    if ( file.good() == false )
    {
        cout << "Plik nie istnieje" << endl;
    }
}
//==========================================================================================
vector<string> assignment( fstream& file )
{
    string line;
    vector<string> words;
    while( getline( file , line ) )
    {
        words.push_back(line);
    }
    return words;
}
//==========================================================================================
vector<string> checkingValues ( vector<string> finishWords )
{
    unsigned int start = 0 ;
    string wordWithVector;
    while ( start < finishWords.size() )
    {
        wordWithVector = finishWords[start];
        size_t found = wordWithVector.find_first_of("!@#$%^&*()_+|");
        if ( found != string::npos )
        {
            finishWords.erase(finishWords.begin()+start);
        }
        else
            start++;
    }
    return finishWords;
}
//========================================================================================
void countingOfWords ( const vector<string>& endChangesWords )
{
    for ( unsigned int i = 0 ; i < endChangesWords.size() ; i++)
    {
        cout << "to sa słowa: " << endChangesWords[i] << endl;
    }
    map <string,int> countWords;
    for ( auto const& elem : endChangesWords)
    {
        auto status = countWords.insert(make_pair(elem, 1));
        if ( !status.second )
        {
            ++status.first->second;
        }
    }
    for ( auto const& item : countWords )
    {
        cout << item.first << " : " << item.second << endl;
    }
}

Wiem już że stosuje złe nazwy po angielsku naprawie to.

I co dziwne wydaje mi się że kod powinien działać bo gdy nie używam <!--StartFragment-->endChangesWords tylko vectora który tam stworze i wpisze sam słowa to zlicza dobrze. A jak kompiluje z <!--StartFragment-->endChangesWords dostaje coś takiego:<!--EndFragment-->

ara : 1
 : 3
 : 1
 : 2
 : 1
 : 1
 : 1c
 : 1

 

<!--EndFragment-->

1 odpowiedź

0 głosów
odpowiedź 15 sierpnia 2016 przez jankustosz1 Nałogowiec (35,880 p.)
1)
class A
{
};
int main()
{
   A a, b;
   a = b;
}

Weźmy taki przykład będzie błąd bo nie zdefiniowano operatora przypisania. Ty w ten sposób przypisujesz wektory nie wiem czy działa to dobrze czy źle ale na wszelki wypadek mógłbyś zrobić że funkcje nic nie zwracają a za to wyślesz im referencje.

2)Nie wiem jak działa ta: find_first_of metoda więc na wszelki wypadek mógłbyś ją sprawdzić.

3) auto const& pierwszy raz takie coś widze może dobre ale dziwnie wygląda, nie prościej zostawić auto (w 2 forach)

4)

auto status = countWords.insert(make_pair(elem, 1));
        if ( !status.second )
        {
            ++status.first->second;
        }

metoda insert zwraca chyba iterator nowoutworzonego elementu jeżeli się nie mylę. Po jaką holerę sprawdzasz czy wartość której przed chwilą przypisałeś 1 jest zerem?  nie jestem do końca pewny czy insert w argumencie przyjmuje parę. Ja chyba bym po prostu zrobił tak:

countWords[elem] = 1;

W c# by takie coś nie przeszło bo jest dobrze chroniony i dobrze ale w c++ błędu nie będzie.

Podobne pytania

0 głosów
1 odpowiedź 118 wizyt
pytanie zadane 8 sierpnia 2019 w PHP przez cyrus33 Użytkownik (680 p.)
0 głosów
3 odpowiedzi 757 wizyt
pytanie zadane 13 maja 2016 w JavaScript przez makoso Mądrala (7,380 p.)
0 głosów
3 odpowiedzi 209 wizyt
pytanie zadane 29 lipca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...