С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Заблокирован

For без копирования элементов

11.12.2014, 10:31. Показов 1866. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
std::vector<MyClass> data;
 
for(auto it : data)
{
//В it будет скопирован каждый элемент вектора?
}
 
for(auto it = data.begin(); it != data.end(); it++)
{
//так копирования не будет?
}
Какая существует краткая запись for в последних стандартных для for без копирования элементов внутрь ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2014, 10:31
Ответы с готовыми решениями:

Реверс строки без копирования
Здравствуйте, у меня вопрос только по условию задачи, не могу понять, что от меня требуется. Задача &quot;Написать функцию void...

Stringstream получить буфер без копирования
Добрый день! Собственно сабж - можно ли както получить буфер потока без копирования на моменте функции - str(): const char*...

Защита документа word. (без сохранения, без копирования)
Доброго времени суток. Хочу сначала поблагодарить участников форума за помощь в моим предыдущих темах. На основе ваших советов я написал...

14
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.12.2014, 10:37
Лучший ответ Сообщение было отмечено DukeNukem как решение

Решение

C++
1
for (auto & it : vec)
1
Заблокирован
11.12.2014, 11:03  [ТС]
Цитата Сообщение от DiffEreD Посмотреть сообщение
for (auto & it : vec)
большое спасибо

Добавлено через 19 минут
Хмм... Не всё так гладко, что означает эта ошибка, выдаваемая minGW ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <set>
 
class MyClass
{
public:
    MyClass() {}
    std::string GetName() { return name; }
 
private:
    std::string name;
};
 
int main(int argc, char *argv[])
{
    std::set<MyClass> classes;
    for(auto & it : classes)
    {
        it.GetName(); //ERROR - см ниже
    }
    return 0;
}
ERROR: error: passing 'const MyClass' as 'this' argument of 'std::string MyClass::GetName()' discards qualifiers [-fpermissive]

Добавлено через 1 минуту
Каждый раз убеждаюсь, что minGW в плане информативности ошибок - полная ерунда, вот MSVS говорит понятнее:
error: C2662: 'std::string MyClass::GetName(void)' : cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'
Conversion loses qualifiers
но пока всё равно не понял, почему
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.12.2014, 11:03
Лучший ответ Сообщение было отмечено DukeNukem как решение

Решение

Надо его сделать константным методом:
Цитата Сообщение от DukeNukem Посмотреть сообщение
std::string GetName() const { return name; }
1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.12.2014, 11:07
Лучший ответ Сообщение было отмечено DukeNukem как решение

Решение

Ключи сета это константа - надо писать так:
C++
1
for (const auto & it : set)
1
Заблокирован
11.12.2014, 11:14  [ТС]
Цитата Сообщение от CheshireCat Посмотреть сообщение
Надо его сделать константным методом:
понял, спасибо! Кстати, если вместо std::set, взять тот - же вектор, то такого не потребуется ...

А можно для записи в собственную методичку без отсылания в гугл напомнить, что конкретно делает const в случаях:
1. const std::string GetName() { return name; }
2. std::string GetName() const { return name; }
3. const std::string GetName() const { return name; }

Добавлено через 37 секунд
Цитата Сообщение от DiffEreD Посмотреть сообщение
лючи сета это константа - надо писать так:
for (const auto & it : set)
оо отлично! спасибо

Добавлено через 2 минуты
Цитата Сообщение от DiffEreD Посмотреть сообщение
Ключи сета это константа - надо писать так:
Код C++
1
for (const auto & it : set)
поторопился с благодарностью - так не работает:
error: C2662: 'std::string MyClass::GetName(void)' : cannot convert 'this' pointer from 'const MyClass' to 'MyClass &'
Conversion loses qualifiers
помогает только константный метод по совету CheshireCat из 4-го поста
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
11.12.2014, 11:15
1. const std::string GetName() { ....... }
Возвращает константную строку из неконстантного метода (внутри метода при его выполнении может измениться внутреннее состояние объекта класса).
2. std::string GetName() const { ....... }
Возвращает неконстантную строку из константного метода (внутри метода при его выполнении внутреннее состояние объекта класса гарантированно не изменяется).
3. const std::string GetName() const { ........ }
Возвращает константную строку из константного метода (внутри метода при его выполнении внутреннее состояние объекта класса гарантированно не изменяется).
1
Заблокирован
11.12.2014, 15:29  [ТС]
Цитата Сообщение от DiffEreD Посмотреть сообщение
for (auto & it : vec)
А если в этом переборе нужно будет некоторые элементы этого vec удалять при определённых условиях, то как записать в таком случае правильный перескок на следующий итератор? Да вообще, как правильно сделать перебор std::vector !! , без копирования элементов внутрь цикла и с возможностью удалять некоторые элементы перебираемого во время перебора изнутри этого же цикла ? Можно небольшой экзэмпл
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
11.12.2014, 16:03
C++
1
2
3
4
5
6
7
8
9
10
11
for(std::vector<int >::iterator it = vec.begin(); it != vec.end(); )
{
if(it->someValue == 42)
{
it = vec.erase(it);
}
else
{
it++;
}
}
примерно так
1
11.12.2014, 16:04

Не по теме:

опоздал

0
11.12.2014, 16:07

Не по теме:

DiffEreD, у Вас код почетче был :)

0
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
11.12.2014, 16:08
DukeNukem, книга Язык программирования C++(C++11). Базовый курс», Стенли Б. Липпман, Жози Лажойе, Барбара Э. Му, 5-е издание, раздел 9.3.6 почитайте.
0
Заблокирован
11.12.2014, 22:13  [ТС]
Цитата Сообщение от aLarman Посмотреть сообщение
примерно так
Этот ход знаю, просто думал увидеть какую - то хитрую запись в стиле foreach, типа for(auto & it : vac) и чтоб удалять можно было бы.

Цитата Сообщение от DiffEreD Посмотреть сообщение
DukeNukem, книга Язык программирования C++
я книги не читаю
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.12.2014, 22:46
Цитата Сообщение от DukeNukem Посмотреть сообщение
я книги не читаю
Зря. Меньше пришлось бы форум засорять.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
12.12.2014, 19:06
Цитата Сообщение от DukeNukem Посмотреть сообщение
foreach, типа for(auto & it : vac) и чтоб удалять можно было бы.
ну Вы же зная хранимое значение в векторе никак не удалите элемент же , нужен итератор хотя бы, вот и получается что foreach не подойдет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2014, 19:06
Помогаю со студенческими работами здесь

Присвоение массива БЕЗ копирования
Добрый день. Есть двумерный массив: type TAAInt = array of array of integer; a:TAAInt; setlength(a,4,6); a:=, , , ...

Замена строки в файле без копирования
Добрый день. Уже достаточно долго ищу в интернете, т.к. нет времени читать литературу. Прошу помочь. Имеется большая база данных в виде...

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

Извлечь 2д-слой из 3д массива без копирования по циклу
Реально ли? Все-таки в памяти элементы рядом находятся, хочется как-то ссылкой какой-то обойтись. Вариант с массивом 2д-массивов не...

Хранимая процедура копирования БД (структура без данных)
Добрый день, встала задача создать процедуру копирования базы со всеми внутренними таблицами (без данных) на SQL. По-сути надо всего...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru