gpt4 book ai didi

python - 具有与 Python 的过滤器和映射相同功能的 C++ 工具

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:21 25 4
gpt4 key购买 nike

我正在寻找 map 的 C++ 类似物或 filter来自 Python 编程语言。它们中的第一个对 iterable 的每个项目应用一些函数并返回结果列表,第二个从函数返回 true 的 iterable 的那些元素构造一个列表

我想在 C++ 中使用类似的功能:

  • 将一些函数映射到容器以获得具有转换后数据(并且可能具有不同长度)的新容器;
  • 对容器使用某种条件过滤;

Python 的 map 和 filter 在 C++ 中有没有很好的实现?

在这个简短的示例中,我尝试使用 boost::bind 等工具来解决这个问题和 std::for_each我面临着困难。 std::vector<std::string> result应包含所有字符串 std::vector<std::string> raw该字典顺序高于标准输入的最后一个字符串。但实际上 result返回点的容器仍然是空的。

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/bind.hpp>

void filter_strings(std::string& current, std::string& last, std::vector<std::string>& results)
{
if (current > last)
{
results.push_back(current);
std::cout << "Matched: " << current << std::endl;
}
}

int main()
{
std::vector<std::string> raw, result;
std::string input, last;

//Populate first container with a data
while(std::getline(std::cin, input))
raw.push_back(input);
last = raw.back();

//Put into result vector all strings which lexicographically higher than the last one
std::for_each(raw.begin(), raw.end(), boost::bind(&filter_strings, _1, last, result));

//For some reason the resulting container is empty
std::cout << "Results: " << result.size() << std::endl;

return 0;
}

输入和输出:

[vitaly@thermaltake 1]$ ./9_boost_bind 
121
123
122
120 //Ctrl+D key press
Matched: 121
Matched: 123
Matched: 122
Results: 0

我们将不胜感激。

最佳答案

正如@juanchopanza 所建议的那样,<algorithm> 中的模板函数STL header 是您的最佳选择。

#include <iostream>
#include <vector>


std::vector<std::string> filter(std::vector<std::string> & raw) {
std::vector<std::string> result(raw.size());
std::string last = raw[raw.size() - 1];
auto it = std::copy_if(raw.begin(), raw.end(), result.begin(),
[&](std::string s) { return s.compare(last) > 0; });
result.resize(std::distance(result.begin(), it));
return result;
}

int main(int argc, const char *argv[])
{
std::vector<std::string> raw, result;
std::string input;
while (std::getline(std::cin, input)) {
raw.push_back(input);
}

result = filter(raw);

for (size_t i = 0; i < result.size(); i++) {
std::cout << "Matched: " << result[i] << std::endl;
}
std::cout << "Results: " << result.size() << std::endl;
return 0;
}

编译运行:

$ clang++ -std=c++11 -o cppfilter main.cpp && ./cppfilter
121
123
122
120 // Ctrl + D pressed
Matched: 121
Matched: 123
Matched: 122
Results: 3

关于python - 具有与 Python 的过滤器和映射相同功能的 C++ 工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21865981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com