痔になりやすい生活習慣とは?

C++のstd::vectorが格納する要素として配列を指定することはできますか

vectorを使って2次元配列を表現したいときは,たとえば

std::vecor<std::vector<int>> v;

とすれば2次元配列が表現できますよね.

2次元配列の列方向の要素数が2で固定されていて,行方向の要素数が不確定のデータを扱いたいので,2次元配列を格納するvectorで扱えればなと思いました.
(2個で1組のデータがたくさんあるということなので,vectorの2次元配列ではありません)

std::vector<int[2]> v;

int a[2];
a[1] = 1;
a[0] = 2;
v.push_back(a);

という書き方ではコンパイルできなかったのですが,vectorに配列要素を格納させることはできないのでしょうか.
あるいは,もし可能ならどのように書けばよいのでしょうか.

結局は1組のデータセットを構造体化してそれをvectorにプッシュするやり方に落ち着いたのですが,疑問に思ったままモヤモヤしているので質問させて頂きます.

「vector 配列」などのキーワードで検索してみましたが,vectorの動的配列としての紹介記事が多くヒットしてしまい,自分ではうまく情報を発見することはできませんでした.
よろしくお願いします.

このQ&Aに関連する最新のQ&A

A 回答 (5件)

コンテナに巣の配列を要素として入れることはできません.



C++11 (以降) なら std::array を使えばいい.

C++98 なら
・あきらめる
・Boost の boost::array を使う
・C++11 の std::array 相当のものを自作する
のいずれか, かな.
    • good
    • 1
この回答へのお礼

やっぱり無理なんですね
回答ありがとうございました

お礼日時:2014/12/30 18:23

「配列って結局先頭ポインタなので」という表現は乱暴すぎるし余計に誤解させるだけの可能性が高いので賛同できないなぁ>#3. あと,

コンテナに素のポインタを入れるとかえって管理が面倒になるので正直いってお勧めしない.
    • good
    • 1

> 2個で1組のデータがたくさんある



だったら vector<pair<int,int>> が楽なんじゃ?
    • good
    • 0
この回答へのお礼

pairというものを初めて知りました。
今回はこのpairのようなものを自作して解決していたという感じですね。
回答ありがとうございました。

お礼日時:2014/12/30 18:42

配列って結局先頭ポインタなので、


std::vector<int*> v;
で、できませんか?
要素数の指定はできませんが。

ちなみにためしてはいません。
    • good
    • 0
この回答へのお礼

この発想はありました。
しかし、静的配列のポインタをプッシュしても同じアドレスを突っ込むだけですし、new[]した配列を入れてもvectorがデストラクトされる前にdelete[]しなければならないので管理が大変になるかと思うのでやめました。
ちなみに、静的配列にこだわっていたのは、sizeofで要素数が分かるためです。要素数も一元的に管理したいなら、#1の方が言うようにarray相当のものを自作するのがよさそうですね。
回答ありがとうございました。

お礼日時:2014/12/30 18:32

おっと, 変換を間違えた


(誤) 巣の配列
(正) 素の配列
ということで.
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語の配列をC++のvectorに高速に変換したい

質問は表題のとおりです。
単純な方法では以下の通りになると思いますが、
(C言語文字列から string への変換のように)
一括変換の仕組みは vector にないのでしょうか?
static const int n=5;
int a[n]={0,1,2,3,4};
std::vector<int> v(n);
std::vector<int>::iterator vit=v.begin();
for(int i=0; i<n; i++){
*vit++ = a[i];
}

上記の例では n=5 ですが、nがとても大きな場合に適用したいと考えています。
ちなみに、gcc 3.4.3 を使っています。

Aベストアンサー

> C言語の配列に関して、STL のアルゴリズム(binary_searchなど)を
> 使いたいと考えているのですが、
それなら素直にこうすればよいのではないの?

--------------------
#include <algorithm>
#include <iostream>
int main(){
  using namespace std;
  static const int n=5;
  int a[n]={0,1,2,3,4};

  cout << binary_search(a, a+n, 3) << endl;
  cout << binary_search(a, a+n, 6) << endl;

  return 0;
}

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Q構造体のvectorを引数として関数に渡したい。(C++です)

構造体のvectorを引数として関数に渡すときの書き方がわかりません。(最終的には参照かアドレスで渡そうと思っています)

ご教授ください。

いまのところ試した書き方は、下のとおりです(どれもダメでした)

struct mm{
int a;
string b;
};
vectror<mm> mx;


関数の部分
int func(vector <mm> mx) ダメでした
int func(vector struct mm mx) ダメでした

教えてください。

Aベストアンサー

参照かアドレスで渡すのがよいと思います

// 参照渡し
int func(vector<mm>& m) { cout << m.a; }
// 使い方
func(mx);

// アドレス渡し
int func(vector<mm>* m) { cout << m->a; }
// 使い方
func(&mx);

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QSTLで、vectorのファイルへの書き出し、読み込み。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(std::vector<int, std::allocator<int> >, long unsigned int)’
/usr/include/c++/4.2.1/bits/ostream.tcc:173: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]

とのことです orz. どのようにすれば vector を書き出し、そして読み込むことができるのでしょうか。情報がありましたら是非お寄せください。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream...続きを読む

Aベストアンサー

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();

testvector.clear();
count = 0;

ifstream in("test.dat", ios::in | ios::binary);
if ( !in ) return 1;
in.read(reinterpret_cast<char*>(&count), sizeof(count));
testvector.assign(count, 0);
in.read(reinterpret_cast<char*>(&testvector[0]), testvector.size() * sizeof(int));
in.close();

for ( int i = 0; i < testvector.size(); ++i )
cout << testvector[i] << endl;
}

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q配列の要素数に変数を入れたいときには

よろしくお願いします。
配列の要素数には定数しか入れられないのですが,どうしても変数を入れたいときは,それを引数として関数を呼び出すしか方法はないでしょうか。
具体的には,scanfで手に入れたint型の変数を要素数とする配列を宣言したいのですが,どうすれば良いでしょうか。
ご教授ください。

Aベストアンサー

c99と呼ばれる最近の規格では、配列の大きさに変数を使用できます。
bccはc99に対応していないようです。

それ以前の規格では、動的領域確保関数 malloc や callocを使って領域を確保するか、効率等を無視してバカデカい配列を用意しておくかです。
「それを引数として関数を呼び出す」っていうのは、malloc/callocのことですか?

QSTLのvectorで作った配列をメンバ変数にする場合は。。。

C++初心者です。

STLのvectorで作った配列をメンバ変数は
以下のように宣言し、

class Array
{
public:
vector<int> array;
void Set();
}

Array::Setのメンバ関数でarrayに値をセットします。


そして、メインからarrayを参照しようとしましたが
値が入っていませんでした。

メンバ変数の宣言の仕方が良くないのですか?

Aベストアンサー

まず、「エラーになりました」というのは、
相手に状況が全く伝わらないため、コンピュータ系の相談では避けましょう。

代わりに、
「コンパイルが通らない」(+エラーログ添付)とか
「リンクで落ちる」(+エラーログ添付)とか、
「実行時にアクセス違反が起こる」、とか表現してみたらどうでしょうか。

----------------------------------------

肝心の回答ですが、
Array::Set(void)内でアクセスしているarray[0]が
存在しません。
存在しない要素にはアクセスできませんね。
(operator[]は問答無用、at()であれば例外をキャッチできます)

ベタですが、↓これを追加すればとりあえず走りますよ。
vector<int> hoge; array.push_back(hoge);

QC++言語で、構造体のコピーは可能(しても良い)のでしょうか?

C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
問題がある場合は、なぜだめなのか知りたいです。
構造体は可変長ではありません。

typedef struct kumi {
char namae[10];
int ten;
}Kumi;

Kumi a, b;

strcpy(a.namae, "AAA");
a.ten = 50;

b = a;

Aベストアンサー

「C++」では何の問題もありません.
「C」だと, ふる~い時代の遺跡級のコンパイラが文句を言うかもしれません. ま, その手の遺跡級のコンパイラだと
・void がない (void * は char * で代用する)
・プロトタイプが存在しない
・const や volatile がない
・ひょっとすると単項の + もない
など, 今の視点からするといいたいことは山ほどあります (さすがに a -= b; ではなく a =- b; とするコンパイラを使うことはないだろう).
そのような時代には構造体のコピーを memcpy でやっていましたが, C++ では逆に危険です.


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング