Заполните вектор истинным значением - PullRequest
0 голосов
/ 14 февраля 2020

Я хотел бы сделать все значения в std::vector true. Я написал 2 метода: первый работал, а второй нет. Это говорит мне, что myproj.exe вызвал точку останова. Вы знаете, в чем проблема?

Этот работает:

void first(std::vector<bool>& vect, unsigned int n) 
{       
    for (unsigned int i = 0; i < n; i++) 
    {       
        vect.push_back(true);
    }
}

Этот не работает:

void secound(std::vector<bool>& vect, unsigned int n) 
{       
    for(unsigned int i = 0; i < n; i++) 
    {
        vect[i] = true; //crash here        
    }
}

Ответы [ 5 ]

4 голосов
/ 14 февраля 2020

В первом случае, когда вы звоните push_back, который автоматически увеличивает размер вектора.

В втором случае, когда вы пытаетесь получить доступ к vect[i], который не существует так как размер вектора равен 0.

Самый простой способ заполнить вектор здесь будет

vect = std::vector<bool>(n, true);
3 голосов
/ 14 февраля 2020

Вы можете использовать следующие перегрузки std::vector:

vector(size_type count, const T& value, const Allocator& alloc = Allocator());

, где первый аргумент - это размер std::vector, а второй аргумент - начальное значение. .

Полный код:

#include <vector>
#include <iostream>

int main() {
    std::vector<bool> v(10, true);

    for (auto i : v) {
        std::cout << std::boolalpha << i << std::endl;
    }

    return 0;
}

std::vector<bool> v(10, true); создаст вектор с 10 логическими значениями true.

Проверьте это live .

Если вы хотите повторно инициализировать std::vector, это следующие параметры:

  1. используйте std::fill как этот std::fill(v.begin(), v.end(), true);
  2. используйте std::vector::resize как этот v.resize(10, true);, если std::vector уже инициализирован
  3. используйте std::vector::assign как этот v.assign(10, true);
1 голос
/ 14 февраля 2020

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

Также есть логическая разница между реализациями.

В первой реализации функции новые элементы добавляются к уже существующим элементам вектора. Во второй реализации функции существующие элементы перезаписываются.

Но в любом случае обе реализации функции выглядят не очень хорошо. Вы можете сделать ту же операцию, используя один метод класса std :: vector.

Вот демонстрационная программа.

#include <iostream>
#include <iomanip>
#include <vector>

void reset( std::vector<bool> &v, size_t n, bool value = false )
{
    v.assign( n, value );
}

int main() 
{
    std::vector<bool> v;

    reset( v, 5);

    for ( const auto item : v )
    {
        std::cout << std::boolalpha << item << ' ';
    }
    std::cout << '\n';

    reset( v, 5, true );

    for ( const auto item : v )
    {
        std::cout << std::boolalpha << item << ' ';
    }
    std::cout << '\n';

    return 0;
}

Вывод программы:

false false false false false 
true true true true true 
0 голосов
/ 14 февраля 2020

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

Итак, замените этот

void secound(std::vector<bool>& vect, unsigned int n) 
{         
    for(unsigned int i = 0; i < n; i++) 
    {
        vect[i] = true; //it crash here
    }
}

на

void secound(std::vector<bool>& vect, unsigned int n) 
{
    vect.resize(n);  // allocates storage        
    for(unsigned int i = 0; i < n; i++) 
    {
        vect[i] = true; //it no longer crash here
    }
}
0 голосов
/ 14 февраля 2020

Вы можете использовать std :: fill для этого. Это скорее идиоматизм c c ++, чем переназначение

#include <algorithm>
#include <vector>
#include <iostream>

int main()
{
    std::vector<bool> v(8);

    std::fill(v.begin(), v.end(), true);
}
...