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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Zgugu Bamba
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 7
18.07.2011, 14:22     Извлечь элемент из вектора #1
Пожалуйста, помогите разобраться.
Это функция разбивки строки на лексемы, и копирования результатов разбивки в вектор.

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]?
Может быть есть другой способ загрузить строку в вектор так,чтобы потом можно было
извлечь из него отдельные лексемы этой строки?

 Комментарий модератора 
Используйте теги форматирования кода!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CAHTEXHUK
18.07.2011, 14:28
  #2

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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"));
}
OstapBender
 Аватар для OstapBender
581 / 519 / 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() ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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. Но тогда предикат придется писать. По-разному можно.
Zgugu Bamba
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 7
18.07.2011, 16:31  [ТС]     Извлечь элемент из вектора #6
Спасибо, ForEveR!
Хорошая подсказка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2011, 09:45     Извлечь элемент из вектора
Еще ссылки по теме:

Как правильно извлечь данные из вектора и поместить в обект CStepMove C++
C++ Как вернуть элемент вектора?

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
Yandex
Объявления
19.07.2011, 09:45     Извлечь элемент из вектора
Ответ Создать тему
Опции темы

Текущее время: 09:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru