📅  最后修改于: 2023-12-03 15:24:27.356000             🧑  作者: Mango
在C++中,我们经常使用std::vector来存储数据。当我们需要根据元素的值来获取它的索引时,可以尝试使用以下方法。
std::find
是C++ STL中的一个函数,可以在容器中查找给定的元素。它返回一个迭代器,指向容器中第一个与给定元素相等的元素,如果没有找到匹配的元素,返回容器的 end()
迭代器。
#include <algorithm>
#include <vector>
std::vector<int> nums {1, 2, 3, 4, 5};
int target = 3;
auto iter = std::find(nums.begin(), nums.end(), target);
if (iter != nums.end()) {
// std::distance函数可以用来计算迭代器之间的距离,也就是索引值
int index = std::distance(nums.begin(), iter);
std::cout << "target index is " << index << std::endl;
} else {
std::cout << "target not found" << std::endl;
}
上述代码中,我们使用了 std::distance
函数来计算迭代器之间的距离,即要查找的元素在vector中的索引值。
除了使用 std::find
函数,我们还可以使用自定义的查找函数来查找一个元素在vector中的索引值。
#include <vector>
#include <iostream>
template <typename T>
int index_of(std::vector<T>& nums, const T& target) {
auto iter = std::find(nums.begin(), nums.end(), target);
if (iter == nums.end()) {
return -1;
}
return std::distance(nums.begin(), iter);
}
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int target = 3;
int index = index_of(nums, target);
if (index == -1) {
std::cout << "target not found" << std::endl;
} else {
std::cout << "target index is " << index << std::endl;
}
}
上述代码中,我们定义了一个函数 index_of
来查找指定元素在vector中的索引值。此函数使用了 std::find
函数来查找元素,如果找到了,就将迭代器转换为索引值返回;如果查找失败,就返回-1。
除了使用 std::find
,STL中还有其他算法可以查找元素在vector中的索引值。比如,std::lower_bound
和 std::upper_bound
函数可以在有序的vector中快速查找目标元素。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int target = 3;
auto iter = std::lower_bound(nums.begin(), nums.end(), target);
if (iter == nums.end() || *iter != target) {
std::cout << "target not found" << std::endl;
return 0;
}
int index = std::distance(nums.begin(), iter);
std::cout << "target index is " << index << std::endl;
}
上述代码中,我们使用 std::lower_bound
函数来查找目标元素在有序vector中的位置,如果成功找到,就返回该元素的迭代器,并使用 std::distance
函数计算索引值。
上述是三种在C++中查找vector中指定元素索引的方法。在实际情况中,我们可以根据情况选择不同的方法。需要注意的是,当vector中存在重复元素时,使用 std::find
函数可能无法正确返回目标元素的索引。