Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
NotNull
0 / 0 / 0
Регистрация: 25.12.2012
Сообщений: 8
#1

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

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

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

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

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

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

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

Как создать массив строк или символов, чтобы потом можно было с цикла его заполнить?
Есть наработки, но не работает: while(c!=27){ FILE* file1; ...

11
outoftime
║XLR8║
758 / 657 / 212
Регистрация: 25.07.2009
Сообщений: 3,297
Записей в блоге: 5
16.05.2014, 01:31 #2
Лучший ответ Сообщение было отмечено NotNull как решение

Решение

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
5441 / 4836 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 02:00 #4
Лучший ответ Сообщение было отмечено NotNull как решение

Решение

http://www.cplusplus.com/reference/string/string/
http://www.cplusplus.com/reference/vector/vector/?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║
758 / 657 / 212
Регистрация: 25.07.2009
Сообщений: 3,297
Записей в блоге: 5
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
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
Завершенные тесты: 1
16.05.2014, 22:48 #8
remove_if тебе в помощь. Так не получится без извращений, ибо в for'е ты по итераторам идешь, а после erase итераторы меняются, следовательно, возникает полнейшая каша (лучше сформулировать не смог)...
0
outoftime
║XLR8║
758 / 657 / 212
Регистрация: 25.07.2009
Сообщений: 3,297
Записей в блоге: 5
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║
758 / 657 / 212
Регистрация: 25.07.2009
Сообщений: 3,297
Записей в блоге: 5
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
17.05.2014, 22:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 22:29

можно ли и если можно, то как в сессии создать двумерный массив ?&
нужен сабж

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

Как в екселе можно создать выпадающий список?
Как в екселе можно создать выпадающий список: чтобы можно было встать на...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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