std::find 当 std::vector 为空但给定初始大小时的行为

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

根据this post,当容器为空时,

std::find
返回
end
迭代器。但是,当我使用
gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)

运行此代码时

    #include <vector>
    #include <iostream>
    #include <bits/stdc++.h>

    int getIndex(std::vector<int> v, int K)
    {
        auto it = std::find(v.begin(), v.end(), K);
        int index = -1;
        // If element was found
        if (it != v.end()) {
            index = it - v.begin();
        }

        return index;
    }

    int main()
    {
        std::vector<int> map_rows(10);
        for (int ii = 0; ii<5; ii++)
        {
            auto idx = getIndex(map_rows,ii);
            std::cout<<"ii: "<<ii<<", idx: "<<idx<<std::endl;
        }
        return 0;
    }

我明白了

ii: 0, idx: 0
ii: 1, idx: -1
ii: 2, idx: -1
ii: 3, idx: -1
ii: 4, idx: -1

发生这种情况是因为我正在用我需要的大小初始化向量。然而,该向量是空的(或者我是这么认为的,因为我没有向其中推送任何值)。当我使用

std::vector<int> map_rows;

我明白了

ii: 0, idx: -1
ii: 1, idx: -1
ii: 2, idx: -1
ii: 3, idx: -1
ii: 4, idx: -1

我想初始化向量大小,因为它可能很大。有没有人解释一下?

编辑:

看起来是可行的方法,在我的例子中是使用

reserve
,如以下代码所示:

#include <vector>
#include <iostream>
#include <bits/stdc++.h>

int getIndex(std::vector<int> v, int K)
{
    auto it = std::find(v.begin(), v.end(), K);
    int index = -1;
    // If element was found
    if (it != v.end() ){
        index = it - v.begin();
        // std::cout<<"*it: "<<*it<<std::endl;
        // index = std::distance(v.begin(), it);
    }

    return index;
}

int main()
{
    std::vector<int> map_rows;
    map_rows.reserve(10);
    for (int ii = 0; ii<5; ii++)
    {
        std::cout<<"map_rows empty?: "<<map_rows.empty()<<std::endl;
        auto idx = getIndex(map_rows,ii);
        std::cout<<"ii: "<<ii<<", idx: "<<idx<<std::endl;
    }
    return 0;
}

但是,这是一种奇怪的行为,因为对我来说,当

std::vector
被赋予初始大小时,大小应该为零。如果有人想解释/详细说明,我将非常感激。

c++11 stdvector
1个回答
0
投票

但是,向量是空的(或者我是这么认为的,因为我没有向其中推送任何值)

您正在使用这个构造函数

constexpr explicit vector( size_type count,
                           const Allocator& alloc = Allocator() );

“使用

count
默认插入的
T
”实例构建容器 - 因此
vector
 不会为空。它将精确地具有 
10
 默认插入的 
int
 实例。

如果您另一方面使用

std::vector<int> map_rows; map_rows.reserve(10);

will 是空的,但会为 10

 
int
s 保留空间。

这是一种奇怪的行为,因为对我来说,当

std::vector

 被赋予初始大小时,大小应该为零。

对于大多数人来说,如果创建它的初始大小为 10,但实际上创建的大小为 0,他们会感到惊讶。

© www.soinside.com 2019 - 2024. All rights reserved.