vectorのイテレータについて

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

vectorのイテレータについて

#1

投稿記事 by kei_sasaki2 » 9年前

いつもお世話になっています。
C++におけるvectorのイテレータについての事なのですが、
DXLibraryの関数であるLoadDivGraph

コード:

int LoadDivGraph( char *FileName , int AllNum ,
          int XNum , int YNum ,
          int XSize , int YSize , int *HandleBuf ) ;
のint *HandleBuf仮引数としてvector配列を指定するにはどうしたらよいでしょうか。

コード:

vector <int> array;
vector<int>::iterator it = array.begin();
LoadDivGraph("./test.png", 2, 2, 1, 32, 32, it);
または、

コード:

vector <int> array;
LoadDivGraph("./test.png", 2, 2, 1, 32, 32, array);
などを試したのですが出来ませんでしたので、ご教示頂けると幸いです。
用語の使い方がおかしいかもしれませんが、ご容赦下さい(^^;

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

Re: vectorのイテレータについて

#2

投稿記事 by h2so5 » 9年前

コード:

vector <int> array;
array.resize(2); // AllNum
LoadDivGraph("./test.png", 2, 2, 1, 32, 32, &array[0]);

kei_sasaki2
記事: 17
登録日時: 9年前
住所: 北海道

Re: vectorのイテレータについて

#3

投稿記事 by kei_sasaki2 » 9年前

>h2so5様
ありがとうございます。初歩的な事ですみませんでした。

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

Re: vectorのイテレータについて

#4

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

メモ:このような使い方をしても大丈夫である理由(出典:N4296)
23.3.6.1 Class template vector overviewの2 さんが書きました:A vector satisfies all of the requirements of
(中略)
and, for an element type other than bool, of a contiguous container (23.2.1).
std::vector<bool>以外のstd::vectorは"contiguous container"です。
23.2.1 General container requirementsの13 さんが書きました:A contiguous container is a container that supports random access iterators (24.2.7) and whose member
types iterator and const_iterator are contiguous iterators (24.2.1).
"contiguous container"とは、("random access iterators"が使えて)iteratorとconst_iteratorが"contiguous iterators"であるコンテナです。
24.2.1 In generalの5 さんが書きました:Iterators that further satisfy the requirement that, for integral values n and dereferenceable iterator values
a and (a + n), *(a + n) is equivalent to *(addressof(*a) + n), are called contiguous iterators.
"contiguous iterators"は、イテレータaと整数nについて(aと(a + n)がdereferenceableなとき)
*(a + n)が*(addressof(*a) + n)と等価になるイテレータの呼び名です。
20.7.12.1 addressof さんが書きました:template <class T> T* addressof(T& r) noexcept;
Returns: The actual address of the object or function referenced by r, even in the presence of an
overloaded operator&.
addressof(r)は(&演算子がオーバーロードされていても)rが示すオブジェクトまたは関数のアドレスを返します。

よって、std::vector (std::vector<bool>を除く)はイテレータによる要素の参照とアドレスによる要素の参照で同じデータが得られるので、
std::vector (std::vector<bool>を除く)の先頭要素へのポインタを配列の先頭要素へのポインタとして渡してもいい、ということになるはずです。

ということは、

コード:

vector <int> array;
array.resize(2); // AllNum
LoadDivGraph("./test.png", 2, 2, 1, 32, 32, &*array.begin());
と書いたほうが安全(安心)かもしれないと思いました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kei_sasaki2
記事: 17
登録日時: 9年前
住所: 北海道

Re: vectorのイテレータについて

#5

投稿記事 by kei_sasaki2 » 9年前

>みけCAT様
ありがとうございます。どうやら、その方法でも動くようでした。
ちなみに、*array.begin()ではダメなようですが
*array.begin()と&*array.begin()の違いをお教えいただけませんでしょうか。

kei_sasaki2
記事: 17
登録日時: 9年前
住所: 北海道

Re: vectorのイテレータについて

#6

投稿記事 by kei_sasaki2 » 9年前

うーん、一日考えていたんですがみけCATさんの記載して下さった文章を理解する事ができませんでした
仮引数 int *HandleBuf は配列へのポインタ
array.begin() はベクタの先頭を指すイテレータ という認識は間違ってないですよね.
h2so5さんの &array[0] は配列の先頭を指すアドレス?
みけCATさんの &*array.begin() に至ってはさっぱり検討もつきませんでした。

アバター
usao
記事: 1889
登録日時: 11年前

Re: vectorのイテレータについて

#7

投稿記事 by usao » 9年前

array[0] : 先頭要素
→ &array[0] : 先頭要素のアドレス

array.begin() : 先頭要素を指すイテレータ
→ *array.begin() : 先頭要素
→ &*array.begin() : 先頭要素のアドレス

kei_sasaki2
記事: 17
登録日時: 9年前
住所: 北海道

Re: vectorのイテレータについて

#8

投稿記事 by kei_sasaki2 » 9年前

>usaoさん
ありがとうございます、合点がいきました。

閉鎖

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