在C ++结构上的Stl Vector操作

时间:2013-11-02 18:31:22

标签: c++ stl struct upperbound

我定义了这个结构:

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];

你能帮帮我吗?

一个。

2 个答案:

答案 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::bindk参数绑定到它。像

这样的事情
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上。