91

可能な限り最善の方法で、文字列の静的配列のすべての要素を反復処理しようとしています。番号を追跡することなく、1 行で宣言し、要素を簡単に追加/削除できるようにしたいと考えています。とてもシンプルですね。

考えられる非解決策:

vector<string> v;
v.push_back("abc");
b.push_back("xyz");

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

問題 - 文字列のリストを含む 1 行でベクトルを作成する方法がない

考えられる非解決策 2:

string list[] = {"abc", "xyz"};

問題 - 文字列の数を自動的に取得する方法がありません (私が知っていることです)。

これを行う簡単な方法があるはずです。

4

12 に答える 12

108

C ++ 11は、次の構文を可能にするために初期化リストを追加しました。

std::vector<std::string> v = {"Hello", "World"};

このC++11機能のサポートは、少なくともGCC 4.4で、 VisualStudio2013でのみ追加されました。

于 2008-08-29T22:39:43.120 に答える
37

vector<string>静的に作成されたchar*配列から aを簡潔に初期化できます。

char* strarray[] = {"hey", "sup", "dogg"};
vector<string> strvector(strarray, strarray + 3);

ちなみに、これはすべての文字列をコピーするので、2 倍のメモリを使用します。Will Dean の提案を使用して、ここでマジック ナンバー 3 を arraysize(str_array) に置き換えることができます。ただし、その特定のバージョンの arraysize が何か悪いことをする可能性がある特別なケースがあったことを覚えています (詳細をすぐに思い出せなくて申し訳ありません)。 . しかし、多くの場合、正しく機能します。

また、あなたが本当に一行のことを熱心にやっているなら、可変引数マクロを定義して、のような一行が機能するようにすることができますDEFINE_STR_VEC(strvector, "hi", "there", "everyone");

于 2008-08-29T21:21:08.677 に答える
22

問題 - 文字列の数を自動的に取得する方法がありません (私が知っている)。

これを行う標準的な方法があり、多くの人 (MS を含む) が次のようなマクロを定義していますarraysize

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))
于 2008-08-29T18:48:07.187 に答える
8

次のように C++ で文字列の配列を宣言します。char array_of_strings[][]

例えば ​​:char array_of_strings[200][8192];

200 個の文字列を保持し、各文字列のサイズは 8kb または 8192 バイトです。

strcpy(line[i],tempBuffer); 文字列の配列にデータを入れるために使用します。

于 2012-01-11T14:09:20.660 に答える
7

1 つの可能性は、NULL ポインターをフラグ値として使用することです。

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}
于 2008-09-15T19:48:19.190 に答える
4

beginBoost 範囲ライブラリのおよび関数を使用してend、プリミティブ配列の末尾を簡単に見つけることができます。マクロ ソリューションとは異なり、これを誤ってポインターに適用すると、動作が壊れる代わりにコンパイル エラーが発生します。

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));
于 2008-09-23T23:05:10.107 に答える
3

Will Dean の提案 [ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))] を使用して、ここでマジック ナンバー 3 を arraysize(str_array) に置き換えることができます。ただし、その特定のバージョンの arraysize で何か悪いことが起こる可能性がある特別なケースがあったことを覚えています (詳細を思い出せなくて申し訳ありません)。すぐに)。しかし、多くの場合、正しく機能します。

それが機能しないのは、「配列」が実際の配列ではなく単なるポインターである場合です。また、配列が関数に渡される方法 (最初の要素へのポインターに変換される) のため、シグネチャが配列のように見えても、関数呼び出しでは機能しませsome_function(string parameter[])some_function(string *parameter)

于 2008-08-29T21:34:43.197 に答える
3

次に例を示します。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main() {
    const char* const list[] = {"zip", "zam", "bam"};
    const size_t len = sizeof(list) / sizeof(list[0]);

    for (size_t i = 0; i < len; ++i)
        std::cout << list[i] << "\n";

    const std::vector<string> v(list, list + len);
    std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));
}
于 2008-08-29T20:01:31.097 に答える
2
#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}
于 2008-09-06T05:34:36.587 に答える
2

そのマクロの代わりに、これをお勧めします:

template<typename T, int N>
inline size_t array_size(T(&)[N])
{
    return N;
}

#define ARRAY_SIZE(X)   (sizeof(array_size(X)) ? (sizeof(X) / sizeof((X)[0])) : -1)

1) マクロを使用して、コンパイル時の定数にします。関数呼び出しの結果はコンパイル時の定数ではありません。

2) ただし、マクロはポインターで誤って使用される可能性があるため、マクロを使用したくありません。この関数は、コンパイル時配列でのみ使用できます。

したがって、マクロを「安全」にするために関数の定義性を使用します。関数が存在する場合 (つまり、サイズがゼロでない場合)、上記のマクロを使用します。関数が存在しない場合は、不適切な値を返します。

于 2008-09-01T01:05:36.043 に答える
1
#include <iostream>
#include <string>
#include <vector>
#include <boost/assign/list_of.hpp>

int main()
{
    const std::vector< std::string > v = boost::assign::list_of( "abc" )( "xyz" );
    std::copy(
        v.begin(),
        v.end(),
        std::ostream_iterator< std::string >( std::cout, "\n" ) );
}
于 2009-12-12T13:33:11.133 に答える
1

のような文字列の配列を直接宣言できますstring s[100];。その後、特定の要素にアクセスしたい場合は、 のように直接取得できますs[2][90]。反復のために、 s[i].size()関数を使用して文字列のサイズを取得します。

于 2016-01-28T17:03:04.320 に答える