Loading...
Filipbg avatar Filipbg 26 Точки

Short Words

#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

int main()
{
    string line;
    getline(cin, line);
    istringstream lineStream(line);
    string word;
    map<string, string> wordsMap;
    vector<string> wordsVec;
    while(lineStream >> word)
        if(word.size() < 5)
            wordsVec.push_back(word);
    transform(wordsVec.begin(), wordsVec.end(), wordsVec.begin(), ::tolower);
    for(int i = 0; i < wordsVec.size(); ++i)
        wordsMap.insert(pair<string, string>(word, 0));
    for(map<string, string>::iterator it = wordsMap.begin(); it != wordsMap.end(); ++it)
    {
        cout << it->first << ", ";
    }
    cout << (--wordsMap.end())->first << endl;
    return 0;
}

Компилатора крещи |4175|error: cannot convert 'std::__cxx11::basic_string<char>' to 'int' in argument passing и ми отваря stl_algo.h сочейки към  for (; __first != __last; ++__first, ++__result)
    *__result = __unary_op(*__first);
      return __result;

Пробвах и със set и ми дава същия error.

0
C++ Fundamentals 22/10/2019 16:58:32
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет!

1. За задачата ти е нужен Set, не Map:

std::set<std::string> words;

Ти реално въбще не използваш value-то на мапа, задал си че е от string а го пълниш с 0;

Не ти трябва и vector, виждам, че не си #include <vector>

2. Трансформирай направо входа от конзолата, това tolower работи върху char:

std::transform(line.begin(), line.end(), line.begin(), ::tolower);

https://en.cppreference.com/w/cpp/string/byte/tolower

transform(wordsVec.begin(), wordsVec.end(), wordsVec.begin(), ::tolower);

- ти му казваш да работи директо върху стринга, защото вектора ти е от string не от char;

3. Само проверяваш дали ти е по малко от 5 и го добавяш във set-та.

4. Принтираш - може да провериш дали има елементи в set преди да го принтираш

words.size() > 0;
EDIT:
it != --words.end(); - за да не се печата последния елемент

https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator

http://www.cplusplus.com/reference/set/set/

" Sets are typically implemented as binary search trees. "

if (words.size() > 0) {
    for (std::set<std::string>::iterator it = words.begin(); it != --words.end(); ++it) {
        std::cout << *it << ", ";
    }
    std::cout << *(--words.end());
}

Друг вариант за принтиране:

bool isFirst = true;
for (const std::string &word : words) {
    if (!isFirst) {
        std::cout << ", ";
    } else {
        isFirst = false;
    }
    std::cout << word;
}

Поздрави!

0
22/10/2019 19:19:54
Filipbg avatar Filipbg 26 Точки
for(set<string>::iterator it = wordsSet.begin(); it != wordsSet.end() - 1; ++it)

Така изразен цикъла ми излизат купища errors. Първия е |21|error: no match for 'operator-' (operand types are 'std::set<std::__cxx11::basic_string<char> >::iterator {aka std::_Rb_tree_const_iterator<std::__cxx11::basic_string<char> >}' and 'int')|

:/

EDIT: Нямам никаква идея защо с -1 не работи, но сработи с -- отпред

for(set<string>::iterator it = wordsSet.begin(); it != --wordsSet.end(); ++it)
0
22/10/2019 18:35:35
galin_kostadinov avatar galin_kostadinov 166 Точки

Привет!

При тях този оператор не е дефиниран. Добавих работещия оперетор в предния коментар.

Поздрави!

0
Filipbg avatar Filipbg 26 Точки

Благодаря за насоките!

0
Vankata83 avatar Vankata83 72 Точки

Напиши

if(word.size() < 5) {
 transform(wordsVec.begin(), wordsVec.end(), wordsVec.begin(), ::tolower);

//като wordsVec замениш с word

wordsVec.push_back(word);

}

И виж дали ще стане

0
Filipbg avatar Filipbg 26 Точки

Сработи трасформирането, благодаря!

0
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, колега,

Много се радвам, че останалите курсисти те обсипват с отговори.
Успяхме да си направим готино community.

Искам да ти дам един съвет.
Той не е свързан с решението на задачата колкото със справянето с грешките на компилатора.
Когато видиш грешка, която не знаеш какво значи - копираш грешката (или поне първата значима част от нея) и я paste-ваш в Google.
Там ще намериш отговор какво се случва.

Конкретно ти отговарям за грешката в първия ти пост:

map<string, string> wordsMap;
wordsMap.insert(pair<string, string>(word, 0));

ти генерира грешка cannot convert 'std::__cxx11::basic_string<char>' to 'int'
защото мапа ти е от std::string и std::string, а ти му подаваш std::string и int.
Стринга и int-а не са неща, които директно могат да се cast-нат едно към друго (implicit conversion)

Поздрави

0
23/10/2019 09:24:09
Filipbg avatar Filipbg 26 Точки

Благодаря! И това направих още в началото преди да създам topic тук във форума за error-а. Компилатора дори не ми каза на кой ред е причината, само това число 4175. Просто не можах да намеря solution от Google.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.