コンテナAから1要素だけコンテナBへ移動

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
spaaaark・∀・
記事: 66
登録日時: 12年前
住所: 埼玉
連絡を取る:

コンテナAから1要素だけコンテナBへ移動

#1

投稿記事 by spaaaark・∀・ » 11年前

どうもこんにちは、spaaaark・∀・です。
タイトルの通り、C++においてあるコンテナの要素を1つだけ別のコンテナに移動させる方法を探しています。
std::moveを使い、自分でこのようなコードを記述したのですが、Aの要素が1つだけの時にイテレータでの
範囲外アクセスによるランタイムエラーが発生しました。

コード:

// (main関数部分等は省略します)
int Current = 0; // 実際には任意の数
std::vector<unsigned int> A,B;
B.reserve(B.size() + 1);
// やりたいこと:A[0]の要素をBの終端へ移動する
std::move(A.begin()+Current,A.begin()+Current+1,B.end());
// ランタイムエラー: "vector iterator + offset out of range"
moveの第2引数から+1を消去したところ、ランタイムエラーは発生しなくなりましたが、デバッグしたところ
交換できることが確認できませんでした。
この状況を改善したいのですが、方法が分からなくなってしまったので、こちらに投稿させていただきました。
こうすればいい、または別の方法がいい、というのがありましたらご教授いただけると嬉しいです。
なお、実行環境はWin7,Microsoft Visual C++ 2010 expressです。
クリエイティブな生活で刺激的な毎日を!

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

Re: コンテナAから1要素だけコンテナBへ移動

#2

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

std::vectorのreserveは容量の確保は行いますが、実際の要素数は操作しません。
std::vectorの要素数を変えるには、resizeを用いてください。
そもそも、std::vectorの末尾に追加したいのであれば、素直にpush_backを使えばいいと思います。
一般のコンテナの操作を行いたいということですか?

コード:

#include <vector>
#include <cstdio>

void vecdump(const char* lab,const std::vector<unsigned int> v) {
	printf("%s",lab);
	for(unsigned int i=0;i<v.size();i++)printf("%u ",v[i]);
	putchar('\n');
}

int main() {
	int Current = 0; // 実際には任意の数
	std::vector<unsigned int> A,B;
	A.push_back(0);
	A.push_back(1);
	A.push_back(2);
	A.push_back(3);
	B.push_back(4);
	B.push_back(5);
	B.push_back(6);
	B.push_back(7);
	vecdump("before A= ",A);
	vecdump("before B= ",B);
	// やりたいこと:A[0]の要素をBの終端へ移動する
	B.push_back(*(A.begin()+Current));
	A.erase(A.begin()+Current);
	vecdump("after  A= ",A);
	vecdump("after  B= ",B);
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
spaaaark・∀・
記事: 66
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: コンテナAから1要素だけコンテナBへ移動

#3

投稿記事 by spaaaark・∀・ » 11年前

調べてみたところ、std::moveは移動元の要素を削除する機能がなかったようなので、
両者がvectorでよかったためみけCAT氏の回答のコードを活用し、目的の動作を達成しました。
わざわざありがとうございました。
クリエイティブな生活で刺激的な毎日を!

閉鎖

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