1

次のようなスタックがある場合、スタックの仕組みに混乱しています

stack<string,vector<int>>

コンテナーは、整数を含むベクトル型のコンテナーであると理解していますが、文字列の目的は何ですか? または、文字列でなくても、ブール値である可能性があります。最初の引数はどのような目的に役立ちますか?

#include <iostream>       
#include <stack>         
#include <vector>         
#include <string>
using namespace std;

int main ()
{
   stack<string,vector<int> > third;  
    third.emplace(1);


  cout << "size of third: " << third.size() << '\n';

}
4

2 に答える 2

3

君の...

stack<string,vector<int>>

std::stack...テンプレートの正しい使用方法ではありません。ほとんどの場合、スタック内の要素の値の型である 1 つのテンプレート パラメーターが必要なだけなので、stack<string>比較的一般的であり、stack<vector<int>>完全にもっともらしいですが、あまり見られません。

2 番目のパラメータがあるので、API を重ねる別のコンテナを指定できます。これは、stackのデフォルトとして変更する必要があるものではなく、通常は の最初のテンプレート パラメータで十分です。std::deque<T>Tstack

2 番目のテンプレート パラメーターを指定する必要がある場合は、通常some_container<T>、合法的だが誤解を招くようなstringforTvector<int>質問で想定されている不一致ではなく、 になります。紛らわしいことに、最初のテンプレート パラメーターの実際の型は、2 番目のパラメーターの既定値であるコンテナー型stackを指定するためにのみ使用されます。std::deque<T>スタックの実際の要素の型はコンテナーの型から取得されるため、コンテナーの型を明示的に指定すると、最初のテンプレート パラメーターstack<>は単なるプレースホルダーであり、機能的には無視されます。これは残念なことです。最初のパラメーターがコンテナーの element_type と一致するという静的アサーションを要求する標準は、誤解を招くコードに対する有効な保護になると私は主張します。

stackコンテナ タイプにも制限があります。実際のデータ ストレージに使用するには、特定の機能をサポートし、特定のタイプ/typedef を提供する必要があります。

于 2013-11-07T05:36:00.497 に答える
2

stack<string,vector<int>>意味がありません.intのベクトルに格納されている文字列のスタックです。明らかにそれはうまくいきません。

stack<int>deque<int>(デフォルト)に格納される int のスタックです。

stack<int,vector<int>>int のベクトルに格納される int のスタックです。

stack<int,MyCustomStorage>カスタムクラスに格納されているintのスタックです(明らかに自分で作成する必要があります)。

編集

テンプレートstack<T,C> Tでは、 のデフォルトを提供するためにのみ使用されているようです。Cデフォルトはdeque<T>です。スタック内の要素の型は常にC::value_typeです。

于 2013-11-07T05:36:16.990 に答える