いろいろなサイトで指定の要素を消したい場合、
C++
1vector<int> v={1,2,3,4}; 2v.erase (v.begin() +2);
3が消える。ということを学びましたが、
しかし下記のように構造体配列にすると
C++
1//DLLヘッダファイル側 2 3//データ1 4struct P_DATA { 5 int model_num1; 6 int model_num2; 7 float para1[10]; 8 float para2[10]; 9}; 10 11//データ2 12struct V_DATA { 13 float V_0[5], V_1[5], V_2[5], V_3[5]; 14 15 float N_0[5], N_1[5], N_2[5], N_3[5]; 16}; 17 18//データまとめ 19struct REGIDATA { 20 //データ1 21 struct P_DATA p_data; 22 23 //データ2 24 std::vector<V_DATA> v_data; 25}; 26
c++
1//DLLメインファイル側 2 3std::vector <REGI_DATA> regi_data; 4 5//c#側から呼び出し、c++側のデータに追加、うまく追加できていました。 6bool __stdcall p_model_add(P_DATA* _data){ 7 8 p_buff = *_data; 9 regi_data.push_back({ p_buff }); 10 11 add_num = regi_data.size() - 1; 12 regi_data[add_num].v_data.push_back({ }); 13 14return true; 15} 16 17//c#側から呼び出し、C++側の構造体配列の指定要素番号を削除、C#側で英字のエラーが出て強制終了。 18bool __stdcall p_model_del(int delete_num){ 19 20 regi_data.erase(regi_data.begin() + delete_num); 21 22return true; 23} 24 25
消せずに、cannot seek vector iterator before beginとかでます。
regi_data(begin)をモニタすると10242000とかとてつもなくでかい数字になっています。
イテレータを勉強して下記のようにしてもNGでした。
C++
1auto itr = regi_data(begin) + delete_num; 2regi_data.erase(itr);
構造体配列の場合vectorのeraseが使えないです。どなたか知恵をお貸しください。よろしくお願いいたします。
追記1:
kyokio様ご回答ありがとうございます。上記が私の書いたエラーコードです。省略してお伝えしすぎました。すみません。
vectorの中にvectorがあるので素直に消えないのかもとか思っています。取り急ぎ上記修正いたします。
追記2:
fanaさん指摘箇所修正しました。
上記のように修正しても以前指定番号はうまく消せませんでした。
回答3件
あなたの回答
tips
プレビュー