Проверка границ итератора при превышении размера вектора - PullRequest
3 голосов
/ 01 июня 2019

У меня другой вопрос, потому что я не ищу range-3v решения. Кроме того, я специально спрашивал, как исправить проблему со вторым циклом. Я принял ответ ниже моего вопроса уже. Поскольку мне не понадобился второй цикл for, они показали мне, как использовать один индекс, добавив в него 1 для нечетных итераций. Это решило мою проблему!


Я пишу функцию, которая будет принимать вектор, предполагая, что он имеет четную длину элементов; В моей функции я создаю два временных вектора из исходного вектора, где их элементы равны {0,2,4,6,...} и {1,3,5,7,...} соответственно. Затем я добавляю соответствующие проиндексированные элементы и сохраняю результаты в моем векторе результатов.

Вот моя функция:

void sumElementPairsFromVector(const std::vector<int>& values, std::vector<int>& result)
{
    using It = std::vector<int>::const_iterator;
    std::vector<int> temp1, temp2;

    // First lets divide the original vector into two temp vectors
    for (It it1 = values.cbegin(); it1 != values.cend(); it1 += 2)
        temp1.push_back(*it1);

    for (It it2 = values.cbegin() + 1; it2 != values.cend() ; it2 += 2)
        temp2.push_back(*it2);

    // Add each corresponding vector and store that into our results.
    for (std::size_t i = 0; i < values.size() / 2; i++)
        result[i] = temp1[i] + temp2[i];
}

Вот как я это использую:

int main() 
{         
    std::vector<int> values{ 1,2,3,4,5,6 };
    for (auto i : values)
        std::cout << i << " ";
    std::cout << '\n';

    std::vector<int> results;

    sumElementPairsFromVector(values, results);
    for (auto i : results)
        std::cout << i << " ";
    std::cout << '\n';

    return 0;
}

Ожидаемый результат должен быть:

1 2 3 4 5 6
3 7 11

Ошибка отладки в этой строке кода функции:

for (It it2 = values.cbegin() + 1; it2 != values.cend(); it2 += 2 )

Я знаю, что является причиной ошибки; на последней итерации после того, как она увеличивается на 2 и идет, чтобы проверить, it2 != values.cend() идет ли она после конца вектора. Как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 01 июня 2019

Я знаю, что является причиной ошибки; на последней итерации после нее увеличивается на 2 и проверяет, будет ли it2 != values.cend() мимо конца вектора. Как мне это исправить?

Вам не нужны два разных цикла для итерации по вектору values.

std::vector<int> temp1, temp2;
temp1.reserve(values.size() / 2); // reserve the memory
temp2.reserve(values.size() / 2);

for (std::size_t index = 0; index < values.size(); ++index)
{
    if (index & 1) temp2.emplace_back(values[index]); // odd index
    else temp1.emplace_back(values[index]);           // even index
}

Во-вторых, results не выделил никакой памяти в то время

result[i] = temp1[i] + temp2[i];

следовательно из-за неопределенного поведения . Вы должны

for (std::size_t i = 0; i < std::min(temp1.size(), temp2.size()); i++)
    result.emplace_back(temp1[i] + temp2[i]);

С другой стороны, если цель состоит в том, чтобы получить результирующий вектор из суммы последовательных пар элементов , temp1 и temp2 являются избыточными. result можно заполнить просто:

void sumElementPairsFromVector(const std::vector<int>& values, std::vector<int>& result)
{
    result.reserve(values.size() / 2);

    for (std::size_t index = 0; index < values.size() - 1; index += 2)
        result.emplace_back(values[index] + values[index+1]);
}
2 голосов
/ 01 июня 2019

Поскольку вы не работаете с шаблонными функциями, ваша функция использует только вектор, по моему мнению, вам не нужны итераторы.

Вы можете просто получить что-то вроде

...
for (int i = 0; i < values.size(); i += 2) {
    result.push_back(values[i] + values[i + 1]);
}
...

Хорошо, если вы уверены, что values.size() всегда четно.Если это не так, вы можете сделать что-то вроде

void sumElementPairsFromVector(const std::vector<int>& values, std::vector<int>& result)
{
    for (int i = 1; i < values.size(); i += 2) {
        result.push_back(values[i] + values[i - 1]);
    }
    if (values.size() % 2) {
        // whatever you want to do with the last element of an uneven vector
        result.push_back(values[values.size() - 1]);
    }
}

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

...