Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Zgugu Bamba
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 7
#1

Извлечь элемент из вектора - C++

18.07.2011, 14:22. Просмотров 1529. Ответов 6
Метки нет (Все метки)

Пожалуйста, помогите разобраться.
Это функция разбивки строки на лексемы, и копирования результатов разбивки в вектор.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void Tokenize(const string& str, vektor<string>&tk,  const string& delimiters = "")
{
    string::size_type lastPos =0;   
    lastPos = str.find_first_not_of(delimiters);    
 
    while (lastPos != string::npos   )
    {
    string::size_type pos = str.find_first_of(delimiters, lastPos);
 
       vektor.push_back( str.substr(lastPos, pos - lastPos);     
        
        lastPos = str.find_first_not_of(delimiters, pos); 
       
    }
        
}
 
 
 int main() {
 
string a("Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor ");
 
vector<string>v;
 
Tokenize(a,v,"");
 
for(int i = 0;i < v.size(); i++)
cout<<v[i];
 
}
Вопрос:
Почему нельзя извлечь какую-то одну лексему из вектора, например, напр. v[4]?
Может быть есть другой способ загрузить строку в вектор так,чтобы потом можно было
извлечь из него отдельные лексемы этой строки?

 Комментарий модератора 
Используйте теги форматирования кода!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2011, 14:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Извлечь элемент из вектора (C++):

Определить количество положительных элементов вектора С(10) и заменить этим значением минимальный элемент вектора А(5) - C++
Ребята помогите пожалуйста с задачкой. Я сам не шарю в C++, но в этом семестре появился этот предмет! И завтра его надо будет сдать :( Буду...

Как правильно извлечь данные из вектора и поместить в обект CStepMove - C++
Дорого времени суток. В общем у меня такая проблемма. Есть родительский класс CStep. У него есть наследник CStepMove. Создаю вектор: ...

Изменение вектора. Наибольший элемент вектора - C++
Добрый день, нужна оценка кода. Пропустил занятия, делал по теории, опирался на массивы. Скажите, правильно ли реализовано? Создать...

Извлечь элемент из массива рандомным индексом - C++
Привет. Есть массив, задача в том, чтобы извлечь из массива элемент рандомным индексом, но чтобы позже не допустить получение этого же...

Указатель на элемент вектора - C++
Добрый день. У меня программа состоит по такому принципу примерно: есть класс контролер, в котором находятся два модуля, первый это ...

Наибольший элемент вектора - C++
Помогите, пожалуйста разобраться с ошибкой. Прога-ма запрашивает числа, записывает в вектор, находит самое большое число и выводит его на...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CAHTEXHUK
18.07.2011, 14:28
  #2

Не по теме:

Цитата Сообщение от Zgugu Bamba Посмотреть сообщение
vektor<string>&tk
Цитата Сообщение от Zgugu Bamba Посмотреть сообщение
void
имеет смысл возвращать этот вектор, а не передавать в качестве параметра

0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
18.07.2011, 14:29 #3
Zgugu Bamba, Кто сказал что нельзя? Можно. Если вы правильно разбиваете конечно)

Вообще вот вполне себе адекватный парсер.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
std::vector<std::string> parse(const std::string& string, const std::string& delims = std::string(""))
{
    std::string str = string;
    for (std::string::iterator iter = str.begin(); iter != str.end(); ++iter)
    {
        if (delims.find(*iter) != std::string::npos)
        {
           *iter = ' ';
        }
    }
    std::stringstream ist(str);
    std::vector<std::string> tokens;
    while (ist >> str)
    {
       tokens.push_back(str);
    }
    return tokens;
}
 
int main()
{
    std::vector<std::string> toks = parse(std::string("Hello, world: and. what!"), std::string(" ,.:!"));
    std::copy(toks.begin(), toks.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
2
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.07.2011, 14:33 #4
ForEveR, блин гениально заменить все разделители на ' '. а я то думал как с помощью СС все разделители учитывать.
C++
1
2
3
4
5
6
7
    for (std::string::iterator iter = str.begin(); iter != str.end(); ++iter)
    {
        if (delims.find(*iter) != std::string::npos)
        {
           *iter = ' ';
        }
    }
может лучше воспользоваться replace_if() ?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
18.07.2011, 14:37 #5
Правда я предпочитаю не писать лесопедов.

C++
1
2
3
4
5
6
int main()
{
   std::vector<std::string> toks;
   boost::split(toks, std::string("Hello, world: and. what!"), boost::is_any_of(" .,:!"), boost::token_compress_on);
   std::copy(toks.begin(), toks.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
Добавлено через 36 секунд
OstapBender, Можно и replace_if. Но тогда предикат придется писать. По-разному можно.
2
Zgugu Bamba
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 7
18.07.2011, 16:31  [ТС] #6
Спасибо, ForEveR!
Хорошая подсказка.
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
19.07.2011, 09:45 #7
Цитата Сообщение от Zgugu Bamba Посмотреть сообщение
Почему нельзя извлечь какую-то одну лексему из вектора, например, напр. v[4]?
Потому что это не откомпилируется...?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
 
void Tokenize(const string& str, vector<string>& tk, const string& delimiters = "")
{
    string::size_type lastPos = 0;
    lastPos = str.find_first_not_of(delimiters);
 
    while (lastPos != string::npos)
    {
        string::size_type pos = str.find_first_of(delimiters, lastPos);
        tk.push_back(str.substr(lastPos, pos - lastPos));
        lastPos = str.find_first_not_of(delimiters, pos);
    }
 
}
 
 
int main()
{
    string a("Lorem ipsum dolor sit amet, consectetur adipiscing elit, set eiusmod tempor ");
    vector<string> v;
    Tokenize(a, v, ",.:;!? "); 
 
    for(vector<string>::size_type i = 0; i < v.size(); i++)
        cout << v[i] << '\n';
}
Цитата Сообщение от OstapBender Посмотреть сообщение
а я то думал как с помощью СС все разделители учитывать.
http://www.cyberforum.ru/cpp-beginners/thread205392.html?uri=/cpp-beginners/thread205392.html#post1180838
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2011, 09:45
Привет! Вот еще темы с ответами:

Изменить элемент вектора - C++
сделал вот такую программку #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;fstream&gt; using namespace std; ...

Найти наибольший элемент вектора - C++
подскажите пожалуйста, вот у меня есть 3-ех мерный массив у меня получается есть задание найти найбольшее значение вектора, тоесть...

Как вернуть элемент вектора? - C++
Всем доброго времени суток. Есть небольшая проблема с методом: student SearchBySecondName (std::string secondName){ std::vector...

Вывести минимальный элемент вектора - C++
Помогите исправить код*надо вывести вектор из 6 чисел(выводит только из 5),а еще я не знаю как сделать что бы в конце программы она...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.07.2011, 09:45
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru