Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38
1

"range-base for" и проверка на последний элемент в std::set<std::string>

02.04.2017, 18:50. Просмотров 1220. Ответов 8
Метки нет (Все метки)

Добрый день.
Голова совсем не варит. Как мне организовать простую проверку на послений элемент без введения счетчика а просто сравнивая адреса итераторов.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
        std::map<char, std::set<std::string>>m = { {'A',{"array","apple","always","accord"}},
{'B',{"bullet","bill","back","BIOS"}},{'C',{"current","Canada","cross","cute"}} };
            
        {
            for (auto&i : m) {//pair
                std::cout << i.first <<": ";
                for (auto& j : i.second) {//set of string
                    if (j!=i.second.end()) {// ЗДЕСЬ Я ХОТЕЛ ДЕЛАТЬ ПРОВЕРКУ 
                        std::cout << j<<", "; 
                    }
                    else {
                        std::cout << j;
                    }
                }
            }
        }
        __asm nop
    }
Собственно вот код. Суть такая хочу проверять не последний ли элемент в дереве.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2017, 18:50
Ответы с готовыми решениями:

отсутствует оператор "<<" соответствующий этим операндам (std::ostream << const std::string)
В 20 строке подсвечиваются красным знаки &lt;&lt;. Пишет, что &quot;отсутствует оператор &quot;&lt;&lt;&quot; соответствующий...

Ошибка: отсутствует оператор ">>"; типы операндов: std::istream >> std::string
Привет всем! Кто-нибудь объясните пожалуйста, что не так, что от меня компилятор требует?

Функция isspace и тип string: Не существует подходящей функции преобразования из "std::string" в "int"
Добрый день! Я только начинаю изучать язык c++ по книге &quot;Язык программирования С++. Базовый курс...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка...

8
Любитель чаепитий
3460 / 1583 / 491
Регистрация: 24.08.2014
Сообщений: 5,483
Записей в блоге: 1
02.04.2017, 19:09 2
Лучший ответ Сообщение было отмечено o4enslabijcoder как решение

Решение

Цитата Сообщение от o4enslabijcoder Посмотреть сообщение
C++
1
if (j!=i.second.end())
end - это уже после последнего элемента.
а проверить можно так: std::addressof(j) != std::addressof(*std::prev(i.second.end()));
1
6907 / 5972 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
02.04.2017, 19:20 3
C++
1
2
3
4
5
for (std::set<std::string>::iterator it = i.second.begin(); it != i.second.end();)
{
  std::cout << *it;
  if (++it != i.second.end()) std::cout << ", "; 
}
0
С чаем беда...
Эксперт CЭксперт С++
7860 / 3790 / 1040
Регистрация: 18.10.2014
Сообщений: 8,046
02.04.2017, 19:55 4
Лучший ответ Сообщение было отмечено o4enslabijcoder как решение

Решение

Цитата Сообщение от o4enslabijcoder Посмотреть сообщение
Как мне организовать простую проверку на послений элемент без введения счетчика а просто сравнивая адреса итераторов.
Вменяемо - никак. Если вам нужна особая обработка для последнего элемента, то что здесь вообще делает range-based for?

О каких "счетчиках" идет речь - не ясно. Напишите обычный нормальный цикл с итераторами и сравнивайте итераторы (итераторы, а не какие-то "адреса итераторов").
0
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38
02.04.2017, 22:40  [ТС] 5
Все спасибо за мнения)

Добавлено через 6 минут
sdelal
C
1
(std::addressof(j)!=std::addressof(*(--i.second.end())))
0
2533 / 1193 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
02.04.2017, 23:20 6
o4enslabijcoder, правильно, не эксперт С++ плохого не посоветует!
1
nmcf
02.04.2017, 23:34
  #7

Не по теме:

А с точки зрения оптимальности?

0
Любитель чаепитий
3460 / 1583 / 491
Регистрация: 24.08.2014
Сообщений: 5,483
Записей в блоге: 1
03.04.2017, 05:24 8
rikimaru2013, где вы увидели, что это мой совет? ТС спросил, я сказал, как можно, я не говорил, что это хоть сколько-нибудь правильно.
ваше невежество сравнимо только с вашим ЧСВ.
0
Грамотный. Безпорно.
16787 / 9683 / 1869
Регистрация: 27.09.2012
Сообщений: 24,028
Записей в блоге: 2
03.04.2017, 06:15 9
Range-Based for для определённого диапазона
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2017, 06:15

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка "не найден оператор, принимающий правый операнд типа "const std::string" "
Привет. Подчеркивает Name. Как можно обратиться к public string из класса наследника? 1) Класс...

Error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "std::string" (или приемлемое
эмулятор работы банкомата Например #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Не существует подходящей функции преобразования из "std::string" в "int"
Я только начинаю изучать язык c++ по книге &quot;Язык программирования С++. Базовый курс 5-е изд...

Передача функции указатель на элемент std::vector<std::string>
Доброй ночи тем, кому не спится (или живет в другом часовом поясе:p)! Есть функция, требующая в...


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

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

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