[](配列アクセス) をconstとしたり、そうでなくしたり

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
piyotaro

[](配列アクセス) をconstとしたり、そうでなくしたり

#1

投稿記事 by piyotaro » 12年前

std::sort(arr, arr + 10, [] (const S &a, const S &b){
if(a[0] != a[1]) return a[0] < a[1];
return a[1] < a[2];
});
の部分で、operator[]が返すのがconstでないのでラムダの引数と一致せず、そのためにコンパイルできません。
vectorなどでは同じ状況でアクセス演算子の[]が使えているのですが、構造体Sでも同じように使うにはどうすれば良いのでしょうか。

コード:

#include <algorithm>
#include <ctime>
#include <cstdlib>

struct S {
    S(int i = 0, int j = 0) {
        arr[0] = i;
        arr[1] = j;
    }
    int arr[2];
    int & operator[](int i){
        return arr[i];
    }
};

int main(){
    srand(time(0U));
    S arr[10];
    for(int i = 0; i < 10; i++){
        arr[i] = S(rand(), rand());
    }
    std::sort(arr, arr + 10, [] (const S &a, const S &b){
        if(a[0] != b[0]) return a[0] < a[1];
        return a[1] < b[1];
    });
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: [](配列アクセス) をconstとしたり、そうでなくしたり

#2

投稿記事 by みけCAT » 12年前

piyotaro さんが書きました:vectorなどでは同じ状況でアクセス演算子の[]が使えているのですが
だとしたら、vectorの仕組みを真似ればいいと思います。
vector<T, Alloc>

この場合、S構造体に

コード:

    const int & operator[](int i){
        return arr[i];
    }
というメンバ関数を追加すればいいでしょう。

【追記】
よくありませんでした。コンパイルエラーが出ます。
解決策を考え中です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: [](配列アクセス) をconstとしたり、そうでなくしたり

#3

投稿記事 by みけCAT » 12年前

前の返信ではvectorの仕組みをきちんと真似ていませんでした。

vectorでは
const_reference operator[](size_type n) const
(http://www.sgi.com/tech/stl/Vector.html)

となっているので、同じように前後にconstを付けた

コード:

    const int & operator[](int i) const {
        return arr[i];
    }
というメンバ関数をS構造体に追加すれば、コンパイルが通りました。

http://ideone.com/PwYHx7
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

piyotaro

Re: [](配列アクセス) をconstとしたり、そうでなくしたり

#4

投稿記事 by piyotaro » 12年前

次回からはそのように調べてから質問します(STLが読めなくて諦めてしまいました)

引数の後のconstを付ければよかったのですか
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る