如何使用 std::find 找到元素的所有位置?
How to find all positions of an element using std::find?
我使用以下代码在std::string
std::vector
中查找字符串。但是如何返回特定元素的所有位置呢?
我只是使用std::find
,但我只能返回第一个位置。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
vector<string> vec;
vector<string>::iterator it;
vec.push_back("a");
vec.push_back("i");
vec.push_back("g");
vec.push_back("h");
vec.push_back("l");
vec.push_back("a");
vec.push_back("n");
vec.push_back("d");
vec.push_back("e");
vec.push_back("r");
it=find(vec.begin(),vec.end(),"a");
int pos = distance(vec.begin(), it);
if(it!=vec.end()){
cout<<"FOUND AT : "<<pos<<endl;
}
else{
cout<<"NOT FOUND"<<endl;
}
return 0;
}
我只能得到 0,我怎么能得到 5
?我只是使用
std::find
,但我只能返回第一个位置。
因为您始终在容器的开头开始搜索。
但是std::find
可以搜索任何范围,而不仅仅是一个完整的容器;所以,只需从最后一个停止的地方开始每个新搜索。
下面是一个基于现有代码的示例:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main() {
std::vector<std::string> vec;
vec.push_back("a");
vec.push_back("i");
vec.push_back("g");
vec.push_back("h");
vec.push_back("l");
vec.push_back("a");
vec.push_back("n");
vec.push_back("d");
vec.push_back("e");
vec.push_back("r");
bool found_at_least_once = false;
auto start_it = begin(vec);
while (start_it != end(vec)) {
start_it = std::find(start_it, end(vec), "a");
if (start_it != end(vec)) {
auto const pos = std::distance(begin(vec), start_it);
std::cout << "FOUND AT : " << pos << 'n';
++start_it;
found_at_least_once = true;
}
}
if (!found_at_least_once) {
std::cout << "NOT FOUND" << 'n';
}
}
关于这一具体方案的意见:
start_it
是每个搜索开始的迭代器。它最初是begin(vec)
.- 只要
start_it
还没有到达end(vec)
,循环就会继续。 - 如果向量为空(
begin(vec) == end(vec)
),则根本不会进入循环。 std::find
返回迭代器找到的元素或end(vec)
。- 如果未找到该元素,则循环将结束,因为
start_it
将被end(vec)
。 - 如果找到,则下一个循环迭代将开始搜索
std::find
由于++start_it;
行而超过最后一个结果的一个元素。 - 因为无论如何你最终都会到达
end(vec)
,所以你需要明确记住是否至少有一个搜索成功,因此布尔变量。这是因为您希望在未找到任何内容时对情况进行特殊处理。如果目标是在从未找到"a"
时简单地打印任何内容,那么您将不需要布尔变量。
一般编码风格的观察:
auto
是一种很好的方法,无需在不牺牲类型安全性的情况下拼写复杂的类型声明。- 首选非成员函数
begin
和end
而不是成员函数。 - 请勿使用
using namespace std;
. - 如果您使用
std::string
,请包括<string>
,否则您的代码完全没有充分的理由依赖于平台。 - 使用
'n'
而不是std::endl
。
就个人而言,我认为基于std::find
/std::distance
的解决方案在这里不是一个非常好的主意。为了代码清晰起见,我可能会使用一个普通的旧for
循环,如下所示:
bool found_at_least_once = false;
for (std::vector<std::string>::size_type pos = 0; pos < vec.size(); ++pos) {
if (vec[pos] == "a") {
std::cout << "FOUND AT : " << pos << 'n';
found_at_least_once = true;
}
}
请注意,vec.size()
可以而且应该替换为 C++17 中的size(vec)
。
这段代码对我有用:
编辑:抱歉没有仔细阅读问题。 ;)
编辑:感谢您的反馈,这是警告删除我的代码!
auto begin = vec.begin();
unsigned int pos = 0;
while (true)
{
auto result = find(begin, vec.end(), "a");
if (result == vec.end()) break;
else
{
if(result == begin) printf("pos: %dn", pos);
++begin;
++pos;
}
}
相关文章:
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 求最大元素位置的分治算法
- 如何将元素添加到向量的字符串位置
- 这个返回元素位置的基于循环的函数有什么问题?
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 数组中所有元素的最新最小元素的第五个位置
- 是否有任何优雅的方式来遍历元素位置可以更改的列表?
- 如何从几乎排序的链表中分离放错位置的元素?
- 如何获得相同数量的第一个和第二个元素以及它们在c++中各自的位置
- 在给定元素在螺旋上的位置的情况下,在二维数组中查找元素
- 这是查找向量中元素位置的合法方法吗?
- 用于在字符串(C )向量中找到元素位置的函数中的错误
- 如何比较和存储 2 个向量的数据元素位置
- 获取与特定模式距离最小的矢量的元素位置
- 最大 N 个等元素位置的 C++ 向量
- OpenCV 从矩阵中获取条件基最大元素位置
- 有没有一种方法可以从传递给排序的lambda中获取元素位置
- 标准::多集,跟踪插入的元素位置
- 在C++中指定数组声明中的元素位置
- 获取std::vector中的元素位置