listクラスの要素にoperator[]を使ってアクセスできるようにしたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#1

投稿記事 by MoNoQLoREATOR » 8年前

listクラスを使う際に

list<int> myList;
myList.push_back(1);
int num = myList[0];

という風に、添字を使って要素にアクセスできたら便利なのに。と思ったのでつくることにしたのですが、コンパイルエラーが出て解決できません。

※私が今までに使ったことがあるC++独自の文法はリファレンスとコンテナクラスだけです。
  classを宣言したのは初めてです。あとテンプレートを宣言したのも初めてです。もちろん演算子オーバー
  ロードを宣言したのも初めてです。参考書をガン見しながら書きました。

以下ソースコード

コード:

#include <list>

template <typename SLIST>
class slist{
public:
	std::list<SLIST> myList;

	SLIST& slist::operater[] (const int &num){
		std::list<SLIST>::iterator it = myList.begin();
		for(int i=0;i<num;i++) it++;
		return *it;
	}
};
以下エラー文

コード:

------ ビルド開始: プロジェクト: slist, 構成: Debug Win32 ------
コンパイルしています...
main.cpp
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(8) : error C2092: 'operater' 配列の要素の型は関数にできません。
        c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(13) : コンパイルされたクラスの テンプレート のインスタンス化 'slist<SLIST>' の参照を確認してください
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(8) : error C2473: 'operater' : 関数定義のようですが、パラメータ リストがありません。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(9) : warning C4346: 'std::list<SLIST>::iterator' : 依存名は型ではありません。
        'typename' を持つプレフィックスは型を示します。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(9) : error C2146: 構文エラー : ';' が、識別子 'it' の前に必要です。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(9) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(9) : error C2864: 'slist<SLIST>::it' : static const int データ メンバ以外をクラス内で初期化することはできません
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2059: 構文エラー : 'for'
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2143: 構文エラー : ')' が ';' の前にありません。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2238: ';' の前に無効なトークンがあります。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2143: 構文エラー : ';' が '<' の前にありません。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2238: ';' の前に無効なトークンがあります。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2143: 構文エラー : ';' が '++' の前にありません。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2059: 構文エラー : ')'
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(10) : error C2238: ';' の前に無効なトークンがあります。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(11) : error C2059: 構文エラー : 'return'
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(11) : error C2238: ';' の前に無効なトークンがあります。
c:\documents and settings\administrator\my documents\visual studio 2008\projects\slist\main.cpp(13) : error C2143: 構文エラー : ';' が '}' の前にありません。
ビルドログは "file://c:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\slist\Debug\BuildLog.htm" に保存されました。
slist - エラー 18、警告 1
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

ご教授よろしくお願い致します。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#2

投稿記事 by h2so5 » 8年前

listではなく、素直にvectorを使ったほうがいいと思います。
listはランダムアクセスするためのコンテナではありません。

アバター
bitter_fox
記事: 607
登録日時: 9年前
住所: 大阪府

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#3

投稿記事 by bitter_fox » 8年前

MoNoQLoREATOR さんが書きました:

コード:

	SLIST& slist::operater[] (const int &num){
operaterはoperatorではないですか?

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#4

投稿記事 by MoNoQLoREATOR » 8年前

ホントですね。operaterになってました。
VisualStudioさんのアシスト機能を使ったので間違いないと思っていたのですが、なぜでしょう?
なにはともあれ解決しました。ありがとうございました。

>>h2so3さん
いちいちイテレーターを宣言して・・・
というのが面倒なのですよ。
vectorで途中の要素を削除するのには時間がかかりすぎるのでvectorでは代用しきれない部分があると思います。

アバター
lriki
記事: 88
登録日時: 9年前

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#5

投稿記事 by lriki » 8年前

既に解決済みですが、気になった点があるので書きこませていただきます。


>いちいちイテレーターを宣言して・・・というのが面倒なのですよ。

boost に BOOST_FOREACH というマクロがあります。ぜひ調べてみてください。

アバター
GRAM
記事: 164
登録日時: 9年前
住所: 大阪

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#6

投稿記事 by GRAM » 8年前

MoNoQLoREATOR さんが書きました:
いちいちイテレーターを宣言して・・・
というのが面倒なのですよ。
vectorで途中の要素を削除するのには時間がかかりすぎるのでvectorでは代用しきれない部分があると思います。
イテレーターの件はVS2010ならautoを使うことによってほぼ無視できます。
for(auto it = l.bebin(); it != l.end(); ++it){
  ~
}
std::advanceという便利な関数もすでに用意されてたりします。
STLは完成度のハンパないライブラリなのでこの機能が超欲しいよってやつはたいていあります

それからこれはどうでもいい話ですが、
組み込み型に毛が生えたようなクラスや構造体ならば実は要素100くらいまで、途中の削除を含めてもvectorのほうが速かったりもします。

//追記:なぜか[解決]マークがつきます・・・何だろこれw
//追記の追記: 取り方を教えていただき取れました。bitter_foxさんどうもですw

アバター
MoNoQLoREATOR
記事: 284
登録日時: 9年前
住所: 東京

Re: listクラスの要素にoperator[]を使ってアクセスできるようにしたい

#7

投稿記事 by MoNoQLoREATOR » 8年前

>>梨樹さん
>>GRAMさん

情報ありがとうございます。便利なものというのは世の中に満ち溢れているのですね。
コンテナクラスはかなりサポートが良いので、listクラスでoperator[]が使えても良い気がしますが、やっぱりないんですね。

閉鎖

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