1

配列(つまり&array [0])の場合と同様に、セット全体を引数として関数に渡したいと思います。セットの生データへのポインターを取得する方法がわかりません。

4

4 に答える 4

4

std::setデータを連続したメモリブロックに配置する必要がないため、配列と同じように実行することはできません。これは二分木であるため、リンクされたノードで構成されている可能性があります。ただし、参照によって渡すことも、begin()andend()イテレータを使用することもできます。

template <typename T>
void foo(const std::set<T>& s);

template <typename Iterator>
void bar(Iterator first, Iterator last);

std::set<int> mySet = ....;
foo(mySet);
bar(mySet.begin(), mySet.end());
于 2012-08-27T06:16:40.247 に答える
2

setは連続メモリに存在しないため、配列の場合と同じ意味で生データへのポインタを取得することはできません。

セット全体を引数として関数に渡したい

参照して渡してください。メモリのオーバーヘッドはありません(それが心配だった場合):

void foo(std::set<int>& x);
于 2012-08-27T06:16:56.013 に答える
1

std::setのすべての要素を抽出するには、を繰り返す必要がありstd::setます。
配列とは異なり、要素を連続メモリに配置する必要があるstd::vectorという標準による要件はありません。std::set

関数内に参照/ポインターを渡し、std::set関数を反復処理して関数内のデータを抽出します。

于 2012-08-27T06:16:46.520 に答える
0

それはあなたが何を意味するかによります:

「セット全体を引数として関数に渡したい」

std::set<int>  data;
// fill data;

あなたは参照によってセットを渡すことができます:

plop(data);   // void plop(std::set<int>& data); // passing be reference would be the C++ way

または、イテレータを渡すこともできます。
これにより、使用しているコンテナーのタイプが抽象化されるため、plop()の作成者はアルゴリズムに集中できます。この場合、イテレータはポインタと同じように動作します(C ++コードの場合)。

plop(data.begin(), data.end(); // template<typename I> void plop(I begin, I end);

または、セット内のデータをCのような関数に渡したいという意味ですか。
この場合、ポインタを渡す必要があります(Cが理解できるのはそれだけです)。残念ながら、実際の意味がないため、ポインタをセットに直接渡すことはできません。ただし、データをベクターにコピーし、そこからCプログラムにコピーすることができます。

std::vector<int>  datavec(data.begin(), data.end());
plop(&data[0], datavec.size());   // void plop(int* data, std::size_t size);

これは、vectorがデータを連続したメモリに格納するために機能します。

于 2012-08-27T06:37:03.740 に答える