![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちわ。
関数のパラメータにpairのdequeを渡したときにfirstを変えてほしくないために
以下のようにプログラムを書きました。ただしdequeの中身自体は削除したいのですが、
エラーになってしまいます。
deque< pair< const int, int > > listTest ;
pair< int, int > pairTest ;
pairTest.first = 0 ; pairTest.second = 4 ; listTest.push_back( pairTest ) ;
pairTest.first = 1 ; pairTest.second = 5 ; listTest.push_back( pairTest ) ;
pairTest.first = 2 ; pairTest.second = 6 ; listTest.push_back( pairTest ) ;
pairTest.first = 3 ; pairTest.second = 7 ; listTest.push_back( pairTest ) ;
// ↓ エラー(こちらは自分の期待通り)。
listTest.begin()->first = 10 ;
// secondは変更できる(こちらも自分の期待通り)。
listTest.begin()->second = 20 ;
// ↓ エラー。
listTest.erase( listTest.begin()) ;
上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。
テンプレート引数にconstが混ざるとリスト自体も削除できなくなってしまうのでしょうか ?
もしエラーを解決できる方法をご存じの方がいらっしゃいましたら教えていただけないでしょうか。
よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
そもそも「コンテナに入れるデータは代入可能じゃないとだめ」と規格に書いてありますな.
あと, これは大きな突込みどころなんだけど「取り除きたいのは先頭や末尾だけではありませんので」というなら deque を使うべきではない.
No.2
- 回答日時:
>上記のリストでリストのアイテム自体は削除できるようにしたいのですが、うまく行きません。
erase() は deque の途中の要素を削除する場合に内容をスライドする可能性があるので、
格納されるオブジェクトがコピー可能でなければならないのでしょう。
先頭要素または末尾の要素を取り除くだけなら pop_front() や pop_back() を利用すればよいのではないですか?
koko_u_ さん、レスありがとうございます。
取り除きたいのは先頭や末尾だけではありませんので、
machongola さんが提示して頂いた方法が私としては回答になります。
これは私が、
> listTest.erase( listTest.begin()) ;
と書いたのが koko_u_ さんに余計な誤解をさせてしまったと思います。
大変失礼しました。質問するときは端折らずにちゃんと書くように致します。
No.1
- 回答日時:
こんばんは。
deque< pair< int, int > >の参照に変換すれば通ります。
typedef deque< pair< const int, int > > const_type;
typedef deque< pair< int, int > > unconst_type;
//unconst_type::iterator&に変換してから複写
unconst_type::iterator it = (unconst_type::iterator&)(listTest.begin());
// ↓ 消せる。
((unconst_type&)listTest).erase(it) ;
// 確認してみる
for(const_type::iterator it2 = listTest.begin(); it2 != listTest.end(); ++it2)
printf("%d %d\n", it2->first, it2->second);
machongola さん、こんにちは。
提示して頂いた方法で期待する動作をしました。
iterator をキャストする発想はありませんでした。
これはこの質問だけではなく、他には応用が効きそうです。
自分の書くプログラムの幅が広がりそうです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) .htaccessファイルの修正がこれで問題ないかどうか 1 2022/04/21 08:42
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- 英語 「this is the/my first time~」の文法上の制約について 1 2023/04/06 09:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
long型の定数の末尾にLを付ける...
-
構造体の宣言でエラーが出ます。
-
戻り値の型??
-
C++ クラスをメンバにもつクラ...
-
変数の型を定義しなかった場合...
-
クラスのメンバ関数を別ファイ...
-
C言語で戻り値を使った正方形の...
-
intとINTの違いは?
-
C++ template operator T()
-
関数の実体定義にヘッダファイ...
-
visualstudio C# テキストボッ...
-
sshdログの意味
-
CStringを含むconst構造体
-
構造体の要素すべてに対する四...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報