用真值填充向量

问题描述 投票:0回答:5

我想将所有值放入

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        
    }
}
c++ c++11 vector std stdvector
5个回答
7
投票

first 情况下,您调用

push_back
会自动增加向量的大小。

第二情况下,您尝试访问

vect[i]
,但它不存在,因为向量的大小为0。

这里填充向量的最简单方法是

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

4
投票

您可以使用以下

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
的向量。

查看直播

如果您想重新初始化

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
投票

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

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

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

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

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 

0
投票

如果在某个类中初始化了向量,则可以使用 std::vector.resize() 方法

void first(std::vector<bool>& vect, unsigned int n) 
{    
    std::vect.resize(n, true);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.