2013-06-08 2 views
1

Сейчас я работаю прямо сейчас с string в vector. И я зашел в тупик. Я манипулирую с помощью vector<int> элементов и понимаю, как с ними работать! Я знаю, как работать с string! Но я не могу получить через ту часть, где мне нужно изменить значение элемента string в векторе. Я имею в виду, что не знаю, что делать в loop с помощью «сделать что-то». Поэтому, чтобы быть коротким, я задаю задачу на работе, которую я сейчас работаю.Изменить значение элемента строки в векторе

Читать последовательность слов из cin и хранения значений в vector .После вы читали все слова, обработать vector и изменить каждое слово в верхний регистр

Вот что я получил до сих пор

int main() 
{ 
    vector<string> words; //Container for all input word 
    string inp;    //inp variable will process all input 

    while (cin>>inp)   //read 
     words.push_back(inp); //Storing words 

    //Processing vector to make all word Uppercase 
    for (int i = 0; i <words.size(); ++i) 
    //do something 

     words[i]=toupper(i); 
    for (auto &e : words) //for each element in vector 
    //do something 

    cout<<e; 

    keep_window_open("~"); 
    return 0; 
} 

Это первое for утверждения не верно я пытаюсь доступ vector элементов и изменить слова в верхний, но did't работе для меня его просто образца
I'v e попробуйте много способов получить доступ к элементу vector, но при попытке использовать функции string-члена toupper() на vector я получаю грязный код и логические ошибки!
Спасибо за ваше время. Извините за ошибки я сделал в написании слов

+1

'toupper' работает только на отдельных персонажей. Вы можете попробовать комбинировать его с 'std :: transform'. – chris

+0

'toupper' работает с целым' string' в операторной базе 'for'. – AlexGreat

+1

Применение 'toupper' к * index *, безусловно, не даст ничего полезного. – celtschk

ответ

4

Попробуйте это:

for (auto& word: words) 
    for (auto& letter: word) 
    letter = std::toupper(letter); 
+0

СПАСИБО! что мне нужно. OMG itslook настолько прост – AlexGreat

+0

Нет необходимости вручную перебирать каждый символ, когда у вас есть диапазоны циклов - на сегодняшний день это лучшее решение! –

0

Вы можете сделать это в первый цикл:

string w = words.at(i); 
std::transform(w.begin(), w.end(), w.begin(), ::toupper); 
+0

это помогает! но это верхний регистр первого элемента индекса. Мне нужно заглавные буквы всех символов в 'vector' – AlexGreat

+0

Woops, вы правы! – jh314

2

Это может быть исправлено с помощью стандартного алгоритма std::transform для перебора символов слов. Вы также можете использовать std::for_each вместо ручной петли.

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

int main() 
{ 
    std::vector<std::string> words; 
    std::string inp; 

    while (std::cin >> inp) 
     words.push_back(inp); 

    std::for_each(words.begin(), words.end(), [] (std::string& word) 
    { 
     std::transform(
      word.begin(), 
      word.end(), 
      word.begin(), (int (&)(int)) std::toupper 
     ); 
    }) 

    for (auto &e : words) 
     std::cout << e << std::endl; 
} 

And here is a demo.

+0

Не работает! У std нет ни одного пользователя toupper! а также получили 8 ошибок в этом коде все о функции преобразования! – AlexGreat

+0

@AlexGreat Включите заголовок '' и используйте мое последнее обновление. – 0x499602D2

+0

Ошибка \t 3 ошибка C2440: '=': невозможно преобразовать из 'int' в 'std :: basic_string <_Elem, _Traits, _Alloc>' – AlexGreat

Смежные вопросы