20

基本的に私はそのようなことをしたいと思います:

int[3] array_func()
{
    return {1,1,1};
}

int main(int argc,char * argv[])
{
    int[3] point=array_func();
}

しかし、それは C++ では合法ではないようです。ベクトルを使用できることはわかっていますが、配列のサイズが一定であることはわかっているため、パフォーマンスの低下が発生する可能性が高いようです。newまた、スタックへの割り当てはより簡単で、パフォーマンスも向上する可能性があるため、できればa を避けたいと思います。

ここでの解決策は何ですか?

4

5 に答える 5

27

ほぼ完成した新しいC++標準(最新のgccおよびmsvc IIRCですでに実装されている)であるC ++ 0xを使用すると、必要に応じて正確に実行できます。int[3]の代わりにstd::arrayを使用するだけです。

std::array<int, 3> array_func()
{
    return {1,1,1};
}

int main(int argc,char * argv[])
{
    std::array<int, 3> point = array_func();
}
于 2009-11-18T10:31:13.287 に答える
22

配列を構造体に入れます。boost::arrayそのようなパッケージです:

boost::array<int, 3> array_func() {
  boost::array<int, 3> a = {{ 1, 1, 1 }};
  return a;
}

int main() {
  boost::array<int, 3> b = array_func();
}

速くて汚い:

template<typename E, size_t S>
struct my_array {
  E data[S];
};

集約初期化構文の使用方法に注意してください。

于 2009-11-18T10:23:19.870 に答える
21

でラップして、struct値で返すことができるようにすることができます。

struct Vec3
{
  float x[3];
}

Vec3 array_func()
{
  Vec3 x = { 1.f, 1.f, 1.f };

  return x;
}

returnステートメントで配列初期化構文を直接使用できるとは思いません。もちろん、コンストラクターを導入することもできます(構造体は、結局のところ、すべてのメンバーがパブリックなクラスにすぎません)。

struct Vec3
{
  Vec3(a, b, c)
  {
    x[0] = a;
    x[1] = b;
    x[2] = c;
  }

  float x[3];
}

Vec3 array_func()
{
  return Vec3(1.f, 1.f, 1.f);
}
于 2009-11-18T10:23:19.113 に答える
3

C++では固定サイズの配列を返すことはできません。int(配列として使用される)へのポインタを返すこともできますが、その場合は、を使用してヒープに配列を割り当てる必要がありますnew

とにかく、配列を引数として関数に渡すことができます。

void array_func( int result[3])
{
    result[0] = 1;
    result[1] = 1;
    result[2] = 1;
}

int main(int argc,char * argv[])
{
    int point[3];
    array_func( point );
}

ただし、これはC++よりもCのように見えます...

于 2009-11-18T10:26:35.947 に答える
0

boost::arrayは、スタックベースの配列のラッパーです。

大きな配列をコピーする必要がない場合、スタック割り当ては「new」を使用するよりも安くなることに注意してください。

于 2009-11-18T10:39:34.103 に答える