質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

3447閲覧

std::vector::eraseの使い方(構造体配列の指定要素の消し方)

puroguraman

総合スコア20

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/08/12 15:08

編集2021/08/13 03:06

いろいろなサイトで指定の要素を消したい場合、

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さん指摘箇所修正しました。
上記のように修正しても以前指定番号はうまく消せませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2021/08/12 15:46 編集

v.size()はいくつで、num には何が入っているのですか? 問題が再現できる、コンパイル可能なコードを提示すると早く解決すると思います。
int32_t

2021/08/13 03:16

繰り返しになりますが、p_model_del() 実行時の regi_data.size() と delete_num はどういう値になっていますか?
puroguraman

2021/08/13 03:42

p_model_add()実行後、 regi_data.size() は1 p_model_del() 実行すると regi_data.size() は1、delete_numは0(c#側で選択) と表示されました。
kazuma-s

2021/08/14 02:03

//c#側から呼び出し、C++側の構造体配列の指定要素番号を削除、C#側で英字のエラーが出て強制終了。 C# から呼び出した場合の問題ですよね。
guest

回答3

0

v.erase (v.begin() +2);

と同様に書くならば,

regi_data.erase(regi_data(begin) + delete_num);

のところは,
regi_data.erase(regi_data.begin() + delete_num);
となるように思うのですが.

regi_data(begin) という書き方は正統なのですか?)

投稿2021/08/13 02:11

fana

総合スコア11654

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

別のところで消した番号を要素参照していました。
お騒がせしました。

投稿2021/08/14 04:53

puroguraman

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

やってみましたができてるみたいです。

コードを貼るので実行してみてください。

C++

1#include<iostream> 2#include<vector> 3using namespace std; 4 5struct A{ 6int a; 7float b; 8}; 9 10int main(){ 11 12 vector<A> v; 13 A a1={1,2}; 14 A a2={2,3}; 15 A a3={4,5}; 16 v.push_back(a1); 17 v.push_back(a2); 18 v.push_back(a3); 19 20 int num;//消したい数字を指定 21 cout << "消したい要素のindexを指定してください:"; 22 cin >> num; 23 24 v.erase (v.begin() +num); 25 26 for(auto nv:v)cout << nv.a << "," << nv.b << endl; 27} 28

投稿2021/08/12 15:56

kyokio

総合スコア560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問