从函数应用程序创建 std::vector
create std::vector from function application
给定对象的向量v1
,以及对其进行操作的函数,返回一个值,
std::vector<OBJ> v1; // already filled
bool foo(const OBJ&);
从对v1
的每个元素应用foo
来创建vector<bool> v2
的最干净方法是什么?我宁愿不编写循环,但我在 STL 中找不到合适的命令。
听起来像是std::transform
的工作。
当然有一个循环,但它是transform
的实现细节。
例:
#include <vector>
#include <algorithm>
template<typename Obj, typename IsTrue>
std::vector<bool> truth(std::vector<Obj> const& v, IsTrue&& truth_func)
{
auto result = std::vector<bool>(v.size());
std::transform(std::begin(v), std::end(v),
std::begin(result),
std::forward<IsTrue>(truth_func));
return result;
}
int main()
{
std::vector<int> v { 1, 2, 3, 4, 5 };
auto is_even = [](auto&& x)
{
return (x % 2) == 0;
};
auto vb = truth(v, is_even);
}
我完全同意使用std::transform
的解决方案。但是,我们可以使用更简单的std::for_each()
来做到这一点<algorithm>
.
我们考虑向量vec
的每个元素(这是你的OBJ
(,insert
下一个向量v
的后端/末端从foo()
返回bool
。
如下所示。这是实景拍摄: https://www.ideone.com/pyfqmF
#include <algorithm>
#include <iostream>
#include <vector>
using OBJ = int;
bool foo(const OBJ& a)
{ return a == 1; }
int main()
{
std::vector< OBJ > vec = {1, 2, 3, 4};
std::vector< bool > v;
v.reserve(vec.size());
std::for_each(vec.begin(), vec.end(), [&v](const OBJ& a)->void
{
v.insert(v.end(), foo(a) );
});
for(auto const& it: v) std::cout << it << std::endl;
return 0;
}
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g