用真实值填充向量

时间:2020-02-13 22:40:03

标签: c++ c++11 vector std stdvector

我想将所有值都放在std::vector true中。我写了两种方法:第一种有效,但第二种无效。它告诉我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        
    }
}

4 个答案:

答案 0 :(得分:4)

第一情况下,您呼叫push_back,这会自动增加向量的大小。

second 情况下,您尝试访问vect[i],因为向量的大小为0,所以该访问不存在。

在此处填充向量的最简单方法是

vect = std::vector<bool>(n, true);

答案 1 :(得分:3)

您可以使用以下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(v.begin(), v.end(), true);那样使用std::fill
  2. 如果v.resize(10, true);已经初始化,请像这样std::vector使用std::vector::resize
  3. 像这样v.assign(10, true);那样使用std::vector::assign

答案 2 :(得分:1)

第二个函数实现的问题是,如果向量为空或元素少于第二个参数的值,则您可能不使用下标运算符。否则,您将具有不确定的行为。

实现之间也存在逻辑差异。

在第一个函数实现中,新元素被附加到向量的现有元素上。在第二个函数实现中,现有元素被覆盖。

但是无论如何,这两个函数的实现都不好看。您可以使用类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 

答案 3 :(得分:0)

您可以使用std::fill来执行此操作。这比重新分配更惯用的c ++

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

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

    std::fill(v.begin(), v.end(), true);
}
相关问题