我定义了这个结构:
typedef struct Systems {
//stuff...
vector<double> list;
} System;
vector <System> system(100);
在某个时刻,我想对system[i].list[0]
或system[i].list[1]
的所有100个条目执行操作
怎么可能这样做?
在一个简单的stl向量上我会这样做:
upper_bound(list.begin() list.end(), R)-list.begin();
但是使用结构,我发现了一些问题:例如我不能使用它:
upper_bound(system.begin().list[1], system.end().list[1], R)-system.begin().list[1];
你能帮帮我吗?
一个。
答案 0 :(得分:0)
一个选项(肯定可能不是最好的)是创建自己的迭代器:
class system_iterator :
public iterator< random_access_iterator_tag, double >
{
public:
system_iterator() {}
system_iterator(vector<System>::iterator itr, size_t idx)
: m_itr(itr), m_idx(idx) {}
bool operator ==(const system_iterator& rhs) const
{ return m_itr == rhs.m_itr; }
bool operator !=(const system_iterator& rhs) const
{ return m_itr != rhs.m_itr; }
double& operator *() const { return (*m_itr).list[m_idx]; }
system_iterator& operator ++() { ++m_itr; }
// Define other operations needed for random access iterator
private:
vector<System>::iterator m_itr;
size_t m_idx;
};
现在,您可以致电:
system_iterator begin( system.begin(), 1 ), end( system.end(), 1 );
System& s = system[ std::upper_bound( begin, end, R ) - begin ];
编辑:在海报澄清了他/她想做的事后,升级了解决方案。
答案 1 :(得分:0)
免责声明:这是未经测试的。
你必须使用upper_bound
的第二种形式,一种取值和比较器。
使用C ++ 11 lambdas很容易:
k = 5;
upper_bound(system.begin(),
system.end(),
R,
[k](double R, System& s) { return R <s.list[k]; });
如果你不能使用C ++ 11,你将不得不编写一个接受三个参数的函数,(int k, double R, System&)
与上面的lambda具有相同的主体
- 使用std::tr1::bind
将k
参数绑定到它。像
double func (int k, double R, System& s)
{
return R < s.list[k];
}
upper_bound(system.begin(),
system.end(),
R,
std::tr1::bind (func, k, _1, _2));
您可能需要using namespace std::tr1::placeholders
。
当然,无论如何你必须确保你的数组按list[k]
排序或至少分区为w.r.t
R上。