LINUX.ORG.RU

Стандартный for в c++

 


0

1

Всем привет! Пишу код:

int X;
map<string, int> Arr_input_X;


for (int i=0; i < Arr_input_X.size(); ++i)
if (X > Arr_input_X[i])
...

Смысл в том что мне нужно именно так, чтобы был i. Не предлагайте подобное:

for (auto it= Arr_input_X.begin();  it != Arr_input_X.end();  it++)

В четвертой строке if (X > Arr_input_X[i]) ошибка:

error: no match for ‘operator[]’ (operand types are ‘std::map<std::__cxx11::basic_string<char>, int>’ and ‘int’)

Но значение Arr_input_X[i] ведь int. Почему ошибка?

Перемещено hobbit из general



Последнее исправление: xaizek (всего исправлений: 1)

Определитесь с тем что вообще вы хотите сделать.

Arr_input_X[i]
map<string
operator [] от словаря, очевидно, ожидает строку в качестве аргумента.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 1)

да чотам уж

for + if = std::find_if + лямбда

anonymous2 ★★★★★
()

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

Тогда вариантов, кроме как прикрутить внешний счётчик особо и нет. Порядковый номер значения в for в плюсах пока не завезли. Естественно, при этом надо следить за возможными continue в середине for’а.

size_t i = 0;
for (const auto& [key, value] : map) {
    if (X > value) {
    }
    ++i;
}
Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Естественно, при этом надо следить за возможными continue в середине for’а.

Для этого scope guards придумали.

utf8nowhere ★★★
()
for(auto &I: Arr_input_X)
    if(X>I.second)
    ...

но вообще смутное ощущение что у Вас в дизайне косяк.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
std::map<std::string,int> m;
auto it = m.begin();
auto it_e = m.end();
for(int i=0;it!=it_e;++i,++it)
{
    int v = it->second;
    ...
}
pathfinder ★★★★
()

Собственно говоря есть документация: https://en.cppreference.com/w/cpp/container/map

Если прям уж очень нужен индекс, то например так

    int X = 2;

    std::map <std::string,int> Arr_input_X { {"test_0", 0}, {"test_1", 1}, {"test_2", 2}, {"test_3", 3} };

    int i = 0;
    for (const auto& n : Arr_input_X) {
        if (X > n.second)
            std::cout << n.first << "[" << i << "]"<< " = " << n.second << "; " << std::endl;
        ++i;
    }

guskov_roman
()

Думаете порядок обхода значений будет детерминирован? Может объясните, зачем именно вам здесь нужен i?

static_lab ★★★★★
()
Ответ на: комментарий от static_lab

В std::map - детерминирован. А счётчик может быть нужен для чего угодно, банально нумерованный список вывести или другой массив индексировать. (Да, пытаться индексировать им ассоциативный контейнер, как в шапке, - бред.)

lwo
()
Ответ на: комментарий от lwo

Да, пытаться индексировать им ассоциативный контейнер, как в шапке, - бред.

Готов предположить что человек делает неумелые попытки построить IndexedDict (в map лежат индексы в vector), но «что-то пошло не так».

UPD: собственно вот здесь:

или другой массив индексировать.

Вы об этом и написали, невнимательно прочитал.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 2)

Для итерации по коллекции существуют соответствующие итераторы. Сначала натягивают сову на глобус, а потом оно у них «ниработаит!11»

alegz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.