0

我定义了这个结构:

typedef struct Systems {
    //stuff...
    vector<double> list;
} System;

vector <System> system(100);

在某个时刻,我想对所有 100 个条目执行操作,system[i].list[0] 或者system[i].list[1] 如何做到这一点?

在一个简单的 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];

你可以帮帮我吗?

一个。

4

2 回答 2

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

编辑:在海报澄清他/她想要做什么之后升级解决方案。

于 2013-11-03T00:11:37.747 回答
0

免责声明:这是未经测试的。

您必须使用 的第二种形式upper_bound,一种接受一个值和一个比较器。

使用 C++11 lambda 很容易:

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.

当然,在任何情况下,您都必须确保您的数组按 R 排序list[k]或至少按 R 分区。

于 2013-11-03T05:47:30.060 回答