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

split C++ для начинающих - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Skatwoker6
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 7
22.04.2013, 22:14     split C++ для начинающих #1
Народ будет большая просьба: кто сможет объяснить как работает split. Искал и не нашел, гугл ничего нормального для понимания не даёт.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2013, 22:14     split C++ для начинающих
Посмотрите здесь:

Аналог метода Split для std::string C++
C++ С/С++ для начинающих
Помогите найти ошибку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.04.2013, 22:14     split C++ для начинающих #2
о каком split-е речь?
hofmn
Helter Skelter
 Аватар для hofmn
61 / 61 / 1
Регистрация: 19.09.2012
Сообщений: 133
22.04.2013, 22:21     split C++ для начинающих #3
Возможно речь идет о разделении сроки на лексемы.
Skatwoker6
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 7
22.04.2013, 23:34  [ТС]     split C++ для начинающих #4
Есть вот такая штука std::vector<std::string> split(const std::string& s) с вектором разобрался теперь надо понять что делает split посколько там по идее должна стоять размерность
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
22.04.2013, 23:39     split C++ для начинающих #5
Проблема в том что не понимаешь что спрашиваешь ...
split это имя объекта вектора
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11804 / 6783 / 767
Регистрация: 27.09.2012
Сообщений: 16,836
Записей в блоге: 2
Завершенные тесты: 1
22.04.2013, 23:40     split C++ для начинающих #6
Цитата Сообщение от Avazart Посмотреть сообщение
split это имя объекта вектора
либо прототип функции
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
22.04.2013, 23:42     split C++ для начинающих #7
Цитата Сообщение от Croessmah Посмотреть сообщение
ну либо прототип функции
Или даже так, поди знай что там, коль такие вопросы пошли...
SummerRain
 Аватар для SummerRain
325 / 324 / 17
Регистрация: 16.12.2012
Сообщений: 544
22.04.2013, 23:44     split C++ для начинающих #8
ты про этот сплит?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::vector<std::string> split(const std::string& s) { // программа выделяет из строки слова и добавляет их в вектор
    std::vector<std::string> vec;
    typedef std::string::size_type str_size;
    str_size i = 0;
    int count = 0;
    while (i != s.size()) {  // до тех по пока не дойдем до конца строки
        while (isspace(s[i]) && i != s.size())  // если пробел, то идём дальше
            ++i;
        str_size j = i;   // первый не пробел
        while (!isspace(s[j]) && j != s.size())   // теперь уже идем дальше, если это не пробел
            ++j;
        if (i != j) {     // если что-то нашли 
            vec.push_back(s.substr(i, j - i));  // то забиваем в вектор под строку начинающиуюся с i(первый не пробел) и до j НЕ включительно
            i = j;   // при равниваем 
        }  
    }    // проходим цикл заново
    return vec;   // возвращаем вектор слов
}
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
22.04.2013, 23:46     split C++ для начинающих #9
Цитата Сообщение от SummerRain Посмотреть сообщение
C++
1
return vec; // возвращаем вектор слов
Жестоко конечно возвращать контейнер ...
Skatwoker6
0 / 0 / 0
Регистрация: 03.01.2013
Сообщений: 7
22.04.2013, 23:50  [ТС]     split C++ для начинающих #10
да этот
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
22.04.2013, 23:51     split C++ для начинающих #11
Цитата Сообщение от Avazart Посмотреть сообщение
Жестоко конечно возвращать контейнер ...
rvo
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
22.04.2013, 23:55     split C++ для начинающих #12
NRVO, но все равно не хорошо, не гибко...
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.04.2013, 10:40     split C++ для начинающих #13
Цитата Сообщение от Avazart Посмотреть сообщение
но все равно не хорошо, не гибко...
Какое Ваше предложение?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
23.04.2013, 11:18     split C++ для начинающих #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
#include <sstream>
 
using namespace std;
 
int main()
{
    string str = "A manhunt across the Boston area results in the death of one suspect and the capture of a second in the Boston Marathon bombings.";
    stringstream ss(str);
    vector<string> split;
 
    copy(istream_iterator<string>(ss),
         istream_iterator<string>(),
         back_inserter< vector<string> >(split));
 
    copy(split.begin(), split.end(), ostream_iterator<string>(cout, "\n"));
 
    return 0;
}
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
23.04.2013, 16:16     split C++ для начинающих #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Какое Ваше предложение?
boost::split() пример есть в книге "сборника рецептов по С++"
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.04.2013, 16:51     split C++ для начинающих #16
Avazart, если не учитывать того, что boost::split шаблон, честно говоря, не вижу особой разницы, возвращать через аргумент-ссылку (boost) или по значению через return (учитывая NRVO). Хотя, может я чего-то не знаю.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
23.04.2013, 16:53     split C++ для начинающих #17
Банально нужно пройтись по нескольким строкам, а кидать результат в один контейнер ...
Либо контейнер изначально не пуст нужно только добавить результат...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
23.04.2013, 17:01     split C++ для начинающих #18
Avazart, Не используется буст для этого. В версии 1.48 по крайней мере.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
        template< 
            typename SequenceSequenceT,
            typename RangeT,
            typename FinderT >
        inline SequenceSequenceT&
        iter_split(
            SequenceSequenceT& Result,
            RangeT& Input,
            FinderT Finder )
        {
            BOOST_CONCEPT_ASSERT((
                FinderConcept<FinderT,
                BOOST_STRING_TYPENAME range_iterator<RangeT>::type>
                ));
 
            iterator_range<BOOST_STRING_TYPENAME range_iterator<RangeT>::type> lit_input(::boost::as_literal(Input));
 
            typedef BOOST_STRING_TYPENAME 
                range_iterator<RangeT>::type input_iterator_type;
            typedef split_iterator<input_iterator_type> find_iterator_type;
            typedef detail::copy_iterator_rangeF<
                BOOST_STRING_TYPENAME 
                    range_value<SequenceSequenceT>::type,
                input_iterator_type> copy_range_type;
            
            input_iterator_type InputEnd=::boost::end(lit_input);
 
            typedef transform_iterator<copy_range_type, find_iterator_type>
                transform_iter_type;
    
            transform_iter_type itBegin=
                ::boost::make_transform_iterator( 
                    find_iterator_type( ::boost::begin(lit_input), InputEnd, Finder ),
                    copy_range_type() );
 
            transform_iter_type itEnd=
                ::boost::make_transform_iterator( 
                    find_iterator_type(),
                    copy_range_type() );
            
            SequenceSequenceT Tmp(itBegin, itEnd);
 
            Result.swap(Tmp);
            return Result;
        }
Особенное внимание стоит обратить на swap в конце.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
23.04.2013, 17:02     split C++ для начинающих #19
Цитата Сообщение от ForEveR Посмотреть сообщение
Avazart, Не используется буст для этого.
Т.е. ?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.04.2013, 17:03     split C++ для начинающих #20
Зато для варианта от SummerRain не требуется создавать контейнер ДО вызова split
Yandex
Объявления
23.04.2013, 17:03     split C++ для начинающих
Ответ Создать тему
Опции темы

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