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

Nastepujace instrukcje wywoluja blad C2440 i C2439

Object Storage Arubacloud
+1 głos
188 wizyt
pytanie zadane 23 stycznia 2022 w C i C++ przez RufinB Obywatel (1,830 p.)
    for (string::iterator i = tekst.begin(); i != tekst.end(); i++) 
        if (!mapa.try_emplace(static_cast<int>(*i), static_cast<int>(*i), 1).second)
            mapa[static_cast<int>(*i)]++;

 

1 odpowiedź

+2 głosów
odpowiedź 23 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

Niezbyt rozumiem co tutaj chcesz zrobić... pokażesz otoczenie? Jaki jest typ zmiennej `mapa`? Bo ten zduplikowany `static_cast<int>(*i)` sugeruje inny typ niż ostatnia linia.

I tak patrząc na to co piszesz... to nie jest równoważne temu po prostu?

for (auto c : tekst)
    mapa[c]++; // nie trzeba recznie try_emplace 1

 

komentarz 23 stycznia 2022 przez RufinB Obywatel (1,830 p.)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <map>
#include <string>
using namespace std;


class Tekst {
    string tekst;
    map<int, int> mapa;
public:
    Tekst(string);
    double stosynek_znakow_z_alfabetu_do_znakow_pozostalych();
    double stosunek_samoglosek_do_spolglosek();
    void uporzadkowana_lista_znakow();
};


int main()
{
    Tekst t("tekst.txt");
    //cout << t.stosynek_znakow_z_alfabetu_do_znakow_pozostalych() << endl;
}


Tekst::Tekst(string sciezka) {
    ifstream plik(sciezka);
    string temp;
    if (!plik) {
        cout << "Cos poszlo nie tak";
        exit(1);
    }
    while (plik) {
        getline(plik, temp);
        if (plik)
            tekst += temp + '\n';
    }
    for (string::iterator i = tekst.begin(); i != tekst.end(); i++) 
        if (!mapa.try_emplace(static_cast<int>(*i), static_cast<int>(*i), 1).second)
            mapa[static_cast<int>(*i)]++;
}

double Tekst::stosynek_znakow_z_alfabetu_do_znakow_pozostalych() {
    int laczna_liczba_znakow = 0;
    int calkowita_liczba_znakow = 0;
    for_each(mapa.begin(), mapa.end(),
        [&](pair<const int, int> para) {
            if (isalpha(static_cast<char>(para.first)))
                laczna_liczba_znakow += para.second;
            calkowita_liczba_znakow += para.second;
        });
    return static_cast<double>(laczna_liczba_znakow) / (calkowita_liczba_znakow-1);
}

double Tekst::stosunek_samoglosek_do_spolglosek() {
    return 5;
}

void Tekst::uporzadkowana_lista_znakow() {

}

program jest niedokonczony 

komentarz 23 stycznia 2022 przez RufinB Obywatel (1,830 p.)
chce zeby jesli w mapie nie ma takiego klucza dodal sie a jesli jest zwiekszyl o jeden
komentarz 23 stycznia 2022 przez adrian17 Ekspert (344,860 p.)

No to tak jak mówiłem, ten drugi `static_cast<int>(*i)` w try_emplace nie ma sensu, nie wiem co on tam robi.

No i tez tak jak mówiłem, to

chce zeby jesli w mapie nie ma takiego klucza dodal sie a jesli jest zwiekszyl o jeden

Jest równoważne po prostu temu:

for (auto c : tekst)
    mapa[c]++; // nie trzeba recznie try_emplace 1

Bo jak klucza nie ma w mapie, to indeksowanie automatycznie go dodaje.

komentarz 23 stycznia 2022 przez RufinB Obywatel (1,830 p.)
dzieki
komentarz 23 stycznia 2022 przez TOWaD Mądrala (5,700 p.)

Jak byś chciał std::emplace()

int main() {
   
    std::map<char,int> ctr {};
    {
        std::ifstream file ("text.txt");
        char ch;
        while (file>>ch) if(!(ctr.emplace(ch,1).second))ctr.at(ch)++;
        file.close();

    }
    for (auto nofl:ctr) {
        std::cout<<nofl.first<<'='<<nofl.second<<'\n';
    } std::cout<<std::endl;

    std::map<std::string,int> ctrw {};
    {

        std::ifstream file ("news.txt");
        std::string ch;
        while (file>>ch) {
                if(std::ispunct(ch.back()))ch.resize(ch.size()-1);
                if(!(ctrw.emplace(ch,1).second))ctrw.at(ch)++;}
                file.close();
    }

    for (auto nofl:ctrw) {
        if(nofl.second>2 and nofl.second<5 and nofl.first.size()>2 )std::cout<<nofl.first<<'\n';
    }std::cout<<std::endl;

 return 0;
}

c++20 nie posiadam dlatego nie ..try

komentarz 23 stycznia 2022 przez adrian17 Ekspert (344,860 p.)
Tylko to wciąż nie ma zalet nad zwykłym indeksowaniem, a ma wady - bo wykonuje wyszukiwanie dwukrotnie.
komentarz 23 stycznia 2022 przez TOWaD Mądrala (5,700 p.)
edycja 24 stycznia 2022 przez TOWaD

Ale ma chyba jedną zaletę, można ustawić wartość startową. Nie wiem czy w domyśle ilość jest ustawiany na 0 lub 1.

edit: No to OK na iteratorze(jedno wyszukanie), bo się na auto się strasznie zawiodłem jak musiałem po klasach skakać.

#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
#include <fstream>

//using namespace std;

int main() {

    std::string buffor="ggg!!!";
    std::map<char,int> ctr {};
    //for(auto ch:buffor) if(!(ctr.emplace(ch,0).second))ctr.at(ch)++;
    {
        std::for_each(buffor.begin(),buffor.end(),[&ctr](auto i) { ctr.emplace(i,2000).first->second++;});
        std::ifstream aa("it.txt");
        std::for_each(std::istream_iterator<char>(aa),std::istream_iterator<char>(),[&ctr](auto i) { ctr.emplace(i,1000).first->second++;});
        aa.close();
      //  std::for_each(std::istream_iterator<char>(std::cin),std::istream_iterator<char>(),[&ctr](auto i) { ctr.emplace(i,3000).first->second++;});
        std::for_each(ctr.begin(),ctr.end(),[](auto i) {std::cout<<i.first<<'='<<i.second<<'\n';});
        std::cout<<std::endl;
    }
    return 0;
}

 

Podobne pytania

0 głosów
1 odpowiedź 563 wizyt
0 głosów
3 odpowiedzi 102 wizyt
0 głosów
2 odpowiedzi 624 wizyt
pytanie zadane 9 października 2022 w C i C++ przez Martita Bywalec (2,470 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 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!

...