sig*_*agi 9 c++ boost stl boost-lambda
我有两个向量.
vector<Object> objects;
vector<string> names;
Run Code Online (Sandbox Code Playgroud)
填充这两个向量并具有相同的大小.我需要一些算法来分配对象变量.它可以使用boost :: lambda.让我们说:
some_algoritm(objects.begin(), objects.end(), names.begin(), bind(&Object::Name, _1) = _2);
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我认为你想要的std::for_each是因为每个Object实例都在就地修改:
std::vector<std::string>::const_iterator names_it = static_cast<const std::vector<std::string>&>(names).begin();
std::for_each(objects.begin(), objects.end(),
boost::lambda::bind(&Object::Name, boost::lambda::_1) = *boost::lambda::var(names_it)++);
Run Code Online (Sandbox Code Playgroud)
这是一个完整的,可编译的例子:
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
class Object
{
public:
std::string Name;
Object(const std::string& Name_ = "")
: Name(Name_)
{
}
};
int main()
{
std::vector<Object> objects(3, Object());
std::vector<std::string> names;
names.push_back("Alpha");
names.push_back("Beta");
names.push_back("Gamma");
std::vector<std::string>::const_iterator names_it = static_cast<const std::vector<std::string>&>(names).begin();
std::for_each(objects.begin(), objects.end(), boost::lambda::bind(&Object::Name, boost::lambda::_1) = *boost::lambda::var(names_it)++);
std::vector<Object>::iterator it, end = objects.end();
for (it = objects.begin(); it != end; ++it) {
std::cout << it->Name << std::endl;
}
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Alpha Beta Gamma
我想不出一个std::算法。但是,您始终可以编写自己的:
template < class It1, class It2, class Operator >
It2 zip_for_each ( It1 first1, It1 last1,
It2 result, Operator op )
{
while (first1 != last1)
op(*first++, *result++);
return result;
}
Run Code Online (Sandbox Code Playgroud)
operator=适当定义,另一种选择是std::copy:
#include <vector>
#include <string>
struct Object {
std::string name;
int i;
void operator=(const std::string& str) { name = str; }
};
int main () {
std::vector<Object> objects(3);
std::vector<std::string> names(3);
names[0] = "Able";
names[1] = "Baker";
names[2] = "Charlie";
std::copy(names.begin(), names.end(), objects.begin());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |