Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;简要检查STL容器中的项目(例如向量)_C++_Boost_Stl - Fatal编程技术网

C++ C++;简要检查STL容器中的项目(例如向量)

C++ C++;简要检查STL容器中的项目(例如向量),c++,boost,stl,C++,Boost,Stl,有没有更简洁的方法来检查x是否在项目中?这似乎是不必要的冗长(重复项目三次),这使得代码的意图更难理解 例如,是否有类似以下内容: bool xInItems = std::find(items.begin(), items.end(), x) != items.end(); 如果没有更简洁的boost/stl算法来检查集合是否包含项,那么使用辅助函数来启用包含(项,x)是好的还是坏的做法 我是否使用了错误的STL容器?即使是std::set也会导致bool xInItems=items.fi

有没有更简洁的方法来检查x是否在项目中?这似乎是不必要的冗长(重复项目三次),这使得代码的意图更难理解

例如,是否有类似以下内容:

bool xInItems = std::find(items.begin(), items.end(), x) != items.end();
如果没有更简洁的boost/stl算法来检查集合是否包含项,那么使用辅助函数来启用
包含(项,x)
是好的还是坏的做法

我是否使用了错误的STL容器?即使是std::set也会导致
bool xInItems=items.find(x)!=items.end()看起来仍然冗长。我想得不对吗?

如果对数据进行了排序,可以使用
std::binary\u search
,它返回一个
bool

bool xInItems = boost::contains(items, x);

如果您确实需要保留未排序的项,但有C++11可用,您可以使用
std::any_of
,但它需要一个谓词,因此它可能至少与
std::find
一样详细(可能更详细)。

查找元素是否在集合中的一个简单方法是:

bool xInItems = std::binary_search(items.begin(), items.end(), x));
因此,如果要使用一组整数,它可以是:

container.find(x) != container.end()
stl::set intSet;
插入(3);
if(intSet.find(3)!=intSet.end())
printf(“找到了!”);

这是因为在C++中偏爱灵活迭代器用法,应该被认为是简洁的。


您可能应该坚持使用std::find,因为它是惯用的,希望它最终会被接受,并提供一个标准的、更简洁的迭代器对替代方案。

从头开始编写模板函数并不难

#include "boost/range/algorithm/find.hpp"

bool xInItems = boost::find(items, x) != items.end();
模板
bool包含(迭代器it1、迭代器it2、常量T和值)
{
返回std::find(it1,it2,value)!=it2;
}
模板
布尔包含(常量容器和c、常量T和值)
{
返回包含(c.begin(),c.end(),value);
}
您甚至可以为具有自己的
find
函数的容器提供专门化,这样它就不会调用
std::find
,来执行以下任务:

template<typename T, typename Iterator>
bool contains(Iterator it1, Iterator it2, const T & value)
{
    return std::find(it1, it2, value) != it2;
}

template<typename T, typename Container>
bool contains(const Container & c, const T & value)
{
    return contains(c.begin(), c.end(), value);
}
#包括
bool xInItems=boost::algorithm::任意等于(items,x)的_;

对于
std::set
,可能是
bool xInItems=(items.count(x)==1)。对于其余部分,
boost::find
可能是您能做的最好的了。(STL和boost中都有一个
count()
,但它们的效率不高,因为它们必须遍历整个范围。)大多数相关的标准库函数都设计为对迭代器而不是整个容器进行操作。这允许以简洁为代价实现更大的灵活性。如果你愿意(我愿意),你当然可以自由编写你自己的助手函数,不过你必须在所有地方都包含它们的标题……如果有人能解释多个反对票,我将不胜感激。我还是一个比较新的关于堆栈溢出的帖子。谢谢,我怀疑这个问题已经存在了。如果是这样的话,那可能就是投票被否决的原因。我想你在寻找(q.v.)。他们最终可能会(或可能不会)进入C++标准。同时,如果你不喜欢“一对迭代器”界面,最好的办法是使用你自己的或使用Boost.Range.来增强上述“工业”优势:用
using std::begin()替换
c.begin()
begin(c)
中,您将神奇地获得阵列支持(对
.end()
)执行相同的操作)(c++11)。其次,我发现返回一个指向元素的指针(或者
可选的
)很有用——当转换到
bool
时,它会给出正确的值,如果(int*x=contains(vec,3))
(我使用
可选的
)。添加标记支持以从序列容器拆分关联容器,以使用关联容器
find
方法而不是线性搜索。问题不是如何编写模板化的contains函数。问题在于标准库或boost中是否已经存在一个,以及自己编写一个是否是好的实践。我仍然给出+1,因为这很有用。std::binary_search返回bool,因此它更简洁,这就是为什么我选择这个答案而不是其他答案的原因。我认为,真正的取而代之的是,不必担心迭代器对的简洁性,因为迭代器对是习惯C++。仍然希望STD::在将来的标准中接受范围,使更简洁的习惯C++成为可能。
template<typename T, typename Iterator>
bool contains(Iterator it1, Iterator it2, const T & value)
{
    return std::find(it1, it2, value) != it2;
}

template<typename T, typename Container>
bool contains(const Container & c, const T & value)
{
    return contains(c.begin(), c.end(), value);
}
#include <boost/algorithm/cxx11/any_of.hpp>

bool xInItems = boost::algorithm::any_of_equal(items, x);