0

この構造体を定義しました:

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

vector <System> system(100);

ある時点で、system[i].list[0] またはの 100 エントリすべてに対して操作を実行したい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];

私たちを手伝ってくれますか?

A.

4

2 に答える 2

0

免責事項: これはテストされていません。

upper_bound値とコンパレータを取るの 2 番目の形式を使用する必要があります。

C++11 ラムダを使えば簡単です:

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&)上記のラムダと同じ本体を持つ3 つの引数を受け入れる関数を作成する必要があります。引数を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です。

もちろん、どのような場合でも、配列が R でソートされているlist[k]か、少なくとも R でパーティション分割されていることを確認する必要があります。

于 2013-11-03T05:47:30.060 に答える
0

1 つのオプション (確かに最善ではないかもしれません) は、独自のイテレータを作成することです。

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 に答える