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

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

Войти
Регистрация
Восстановить пароль
 
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
#1

Можно ли создать список массива строк и если да, то как? - C++

16.05.2014, 01:17. Просмотров 410. Ответов 11
Метки нет (Все метки)

Заранее прошу прощения если вопрос глупый, но ответа на него я не нашел.
Можно ли создать список массива строк и если да то как?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 01:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли создать список массива строк и если да, то как? (C++):

Как создать список строк? - C++
AVE Мне нужно создать список, и в него заносить строки только так что бы не было ограничений в кол-ве строк Вариант с масивом не...

Можно ли передать в функцию либо вектор, либо список, если да, то как? - C++
Можно ли передать в функцию либо вектор, либо список, если да, то как?

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

Как можно считывать инфу с файла в виде массива строк? - C++
Возникла проблема в написании программы, суть в том что я ввожу инфу в файл, все норм записует... а когда считую ее назад получается...

Как создать массив строк или символов, чтобы потом можно было с цикла его заполнить? - C++
Есть наработки, но не работает: while(c!=27){ FILE* file1; file1=fopen("zarplaty.txt","r"); for(i=0;i<lines_count;i++){ ...

можно ли и если можно, то как в сессии создать двумерный массив ?& - C# ASP.NET
нужен сабж

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.05.2014, 01:31 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
NotNull,
C++
1
std::list<std::vector<std::string> > >
0
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
16.05.2014, 01:56  [ТС] #3
Цитата Сообщение от outoftime Посмотреть сообщение
std::list<std::vector<std::string> > >
А как такое заполнить?
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 02:00 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
http://www.cplusplus.com/reference/string/string/
http://www.cplusplus.com/reference/v...tor/?kw=vector
http://www.cplusplus.com/reference/list/list/
0
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
16.05.2014, 03:14  [ТС] #5
И после этих вопросов вполне логичный вопрос напрашивается: как такое вывести?
Как правильно итератор написать?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.05.2014, 03:53 #6
NotNull, в с++11 так
C++
1
2
3
    for (auto row: collection)
        for (auto string: row)
            // output
в с++98 так
C++
1
2
3
4
5
6
7
    for (std::list<std::vector<std::string> >::iterator row = collection.begin(); 
        row != collection.end(); row += 1) 
    {
        for (std::vector<std::string>::iterator string = row->begin(); 
            string != row->end(); string += 1)
            // output (*string)
    }
Добавлено через 2 минуты
P.S. если будешь часто использовать std::list<std::vector<std::string> > и\или std::vector<std::string> их лучше затайпдефить
C++
1
typedef std::list<std::vector<std::string> > LVS; // list vector string
0
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
16.05.2014, 22:19  [ТС] #7
Огромное спасибо, все работает

Добавлено через 8 часов 44 минуты
outoftime, А как теперь удалить какой то элемент c этого вектора?
Например такой вот так не откомпилиться:
C++
1
2
3
4
5
6
 for (auto row : lst)
        for (auto string : row)
            if (string.at(0) == string.at(string.size() - 1))
            {
                row.erase(string);
            }
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
16.05.2014, 22:48 #8
remove_if тебе в помощь. Так не получится без извращений, ибо в for'е ты по итераторам идешь, а после erase итераторы меняются, следовательно, возникает полнейшая каша (лучше сформулировать не смог)...
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.05.2014, 01:08 #9
NotNull, monolit, все верно, в for (auto string : row) так сделать не получится.

http://en.cppreference.com/w/cpp/container/vector/erase
Return value
Iterator following the last removed element.
Т.е. достаточно пройти по коллекции руками.

C++
1
2
3
4
5
6
    std::vector<std::string>::iterator it = row.begin();
    while (it != row.end()) {
        if (it->front() == it->back())
            it = row.erase(it);
        else ++it;
    }
0
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
17.05.2014, 21:14  [ТС] #10
outoftime, используя это результат получился такой:
C++
1
2
3
4
5
6
7
8
9
10
for (auto row : lst)
    {
        std::vector<std::string>::iterator it = row.begin();
        while (it != row.end())
        {
            if (it->front() == it->back())
                it = row.erase(it);
            else ++it;
        }
    }
Но коллекция остается той же что и до удаления. То есть в дебагере все удаляет с вектора, но когда начинает идти по внешнему циклу т.е. по списку(lst), там оно остается (при просмотре в дебагере или потом при выводе).
Я что то не учёл?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
17.05.2014, 21:43 #11
NotNull, дальше идет чисто ИМХО: фор по листу может идти по list.cbegin(), list.cend(), т.е. по константным итераторам, т.е. элементы коллекции модифицировать нельзя. Попробуй изменить внешний цикл по такой же схеме.
C++
1
2
3
4
5
6
    typedef std::vector<std::string> VS;
    typedef std::list<VS> LVS;
    for (LVS::iterator row = list.begin(); row != list.end(); ++row) 
        for (VS it = row->begin(); it < row->end(); ++it) 
            if (it->front() == it->back())
                it = row.erase(it);
Код не тестировал.
0
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
17.05.2014, 22:29  [ТС] #12
Всё работает.
Чуть-чуть подправил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef std::vector<std::string> VS;
    typedef std::list<VS> LVS;
    for (LVS::iterator row = lst.begin(); row != lst.end(); ++row)
    {
 
        VS::iterator it = row->begin();
        while (it != row->end())
        {
            if (it->front() == it->back())
                it = row->erase(it);
            else ++it;
        }
    }
Огромное спасибо за помощь!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 22:29
Привет! Вот еще темы с ответами:

Имеется два массива строк, если имеются одинаковые элементы в массивах , создать из них новый массив - Pascal
товарищи програмисты помогите студенту срочно нужно решить вот эти задачки они часть курсовой сроки поджимают буду очень благодарен ...

Как в екселе можно создать выпадающий список? - VBA
Как в екселе можно создать выпадающий список: чтобы можно было встать на ячейку, нажать на 'треугольничек', появится выпадашка. Выбрать из...

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

Если можно создать массив TButton, то как создать массив их событий? - Lazarus
Пишу программу в которой много однообразных Едитов и кнопок. Чтобы &quot;облегчить сбе жизнь&quot; создал MyEdit: array of TEdit. Аналогично можно...


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

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

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