IT

C ++에서 배열을 선언하는 방법은 무엇입니까?

lottoking 2020. 9. 15. 08:02
반응형

C ++에서 배열을 선언하는 방법은 무엇입니까?


가능한 최선의 방법으로 정적 배열의 모든 요소를 ​​배열합니다. 한 줄에 선언하고 쉽게 추가를 추적 할 수 있습니다. 정말 간단하지 않나요?

가능한 비 해결 방법 :

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

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

한 줄에 벡터를 생성하는 방법이 없습니다.

가능한 비 해결 방법 2 :

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

문제-문자열 수를 자동으로 수있는 방법이 없습니다 (내가 알고있는).

이를 수행하는 쉬운 방법이됩니다.


부스트 할당 라이브러리는 당신이 찾고있는 정확하게 것 같다. 컨테이너에 상수를 어느 때보 다 쉽게 할당 할 수 있습니다.


C ++ 11은 다음 구문을 허용하는 초기화 목록을 추가했습니다.

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

이 C ++ 11 기능에 대한 지원은 GCC 4.4 이상 Visual Studio 2013 에서만 추가되었습니다 .


vector<string>정적으로 생성 된 char*배열 에서 간결하게 초기화 할 수 있습니다 .

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

그건 그렇고 모든 메모리를 사용합니다. Will Dean의 제안을 사용하여 여기서 매직 넘버 3을 arraysize (str_array)로 대체 할 수 있습니다. 특정 버전의 arraysize가 뭔가 나쁜 일을 할 수있는 특별한 경우가 있음을 기억합니다 (미안하지만 즉시 세부 사항을 기억할 수 없습니다). 그러나 매우 자주 작동합니다.

또한, 한 줄에 활동하는 경우 궁호라면, 매크로를 정의하여 한 줄이 DEFINE_STR_VEC(strvector, "hi", "there", "everyone");작동 하도록 할 수 있습니다 .


문제-문자열 수를 자동으로 방법이 없습니다 (내가 알고있는).

많은 사람들 (MS 포함)이 다음과 같은 매크로를 정의하는 늪지 표준 방법이 있습니다 arraysize.

#define arraysize(ar)  (sizeof(ar) / sizeof(ar[0]))

다음과 같이 C ++에서 배열을 선언합니다. char array_of_strings[][]

예 : char array_of_strings[200][8192];

각 크기는 8kb 또는 8192 바이트입니다.

strcpy(line[i],tempBuffer);상위 배열에 데이터를 넣는 데 사용 합니다.


한 가지 가능성은 NULL 포인터를 플래그 값으로 사용하는 것입니다.

const char *list[] = {"dog", "cat", NULL};
for (char **iList = list; *iList != NULL; ++iList)
{
    cout << *iList;
}

부스트 범위 라이브러리 beginend함수를 사용하여 기본 배열의 끝을 쉽게 사용할 수 있고, 매크로 솔루션과 달리 실수로 포인터에 적용하면 잘못된 동작 대신 오류가 발생합니다.

const char* array[] = { "cat", "dog", "horse" };
vector<string> vec(begin(array), end(array));

Will Dean의 제안 [ #define arraysize(ar) (sizeof(ar) / sizeof(ar[0]))]을 사용하여 여기서 매직 넘버 3을 arraysize (str_array)로 변경할 수 있습니다. 특정 버전의 배열 크기가 뭔가 나쁜 일을 할 수있는 특별한 경우가있는 것이 기억하지만 (미안하지만 세부 사항을 기억할 수 없습니다. 바로). 그러나 매우 자주 작동합니다.

작동하지 않는 경우는 "배열"이 실제 배열이 아닌 포인터 일 때입니다. -방식의 배열이 (첫 번째 요소에 대한 포인터로 변환) 함수에 전달되기 때문에 또한 작동하지에서 작업 배열과 같은 서명 보이는 경우에도 호출하지 some_function(string parameter[])정말 some_function(string *parameter).


boost :: 배정을 받았던 Craig H의 답변을 찬성하려고 시도했지만 없습니다. :(

나는 Andrei Alexandrescu가 C / C ++ Users Journal , Vol 16, No 9, September 1998, pp. 73-74 에서 읽은 첫 번째 기사에서 유사한 기술을 접했습니다 (내 구현에 대한 주석에 있으므로 전체 인용 그 이후로 사용해온 그의 코드).

템플릿은 친구입니다.


예를 들면 다음과 같습니다.

#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"));
}

해당 매크로 대신 다음을 제안 할 수 있습니다.

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) 그러나 매크로가 실수로 포인터에 사용될 수 있으므로 매크로를 사용하고 싶지 않습니다. 이 함수는 컴파일 타임 배열에서만 사용할 수 있습니다.

따라서 우리는 매크로를 "안전"하게 만들기 위해 함수의 정의성을 사용합니다. 함수가 존재하는 경우 (즉, 크기가 0이 아닌 경우) 위와 같이 매크로를 사용합니다. 함수가 존재하지 않으면 잘못된 값을 반환합니다.


#include <boost/foreach.hpp>

const char* list[] = {"abc", "xyz"};
BOOST_FOREACH(const char* str, list)
{
    cout << str << endl;
}

#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" ) );
}

#include <iostream.h>
#include <iomanip.h>

int main()
{
int n;
cout<<"enter the maximum number\n";
cin>>n;
cout<<"enter the first number\n";
for(int i=0;i<n;i++)
{

for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
cout<<"enter the second number\n";
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
cin>>b[i][k];
}
}
cout<<"the product will be\n";
for(int i=0;i<n;i++)
{
for(int g=0;g<n;g++)
{
c[i][g]=c[i][c]*c[i][j];
cout<<setw(5)<<c[i][g];
}
cout<<endl;
}
return 0;
}

같은 문자열 배열을 직접 선언 할 수 있습니다 string s[100];. 그런 다음 특정 요소에 액세스하려면 s[2][90]. 반복을 위해 s[i].size()함수를 사용하여 문자열 크기를 가져옵니다 .

참고 URL : https://stackoverflow.com/questions/34987/how-to-declare-an-array-of-strings-in-c

반응형