根据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
被赋予初始大小时,大小应该为零。如果有人想解释/详细说明,我将非常感激。
但是,向量是空的(或者我是这么认为的,因为我没有向其中推送任何值)
您正在使用这个构造函数:
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 保留空间。
这是一种奇怪的行为,因为对我来说,当对于大多数人来说,如果创建它的初始大小为 10,但实际上创建的大小为 0,他们会感到惊讶。
std::vector
被赋予初始大小时,大小应该为零。