문제

가능한 최선의 방법으로 정적 문자열 배열의 모든 요소를 ​​반복하려고 합니다.한 줄에 선언하고 번호를 추적할 필요 없이 요소를 쉽게 추가/제거할 수 있기를 원합니다.정말 간단해 보이지 않나요?

가능한 비해결책:

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 그리고 오직 비주얼 스튜디오 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];

200개의 문자열을 보유하며 각 문자열의 크기는 8kb 또는 8192바이트입니다.

사용 strcpy(line[i],tempBuffer); 문자열 배열에 데이터를 넣습니다.

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

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

당신은 사용할 수 있습니다 begin 그리고 end Boost 범위 라이브러리의 함수를 사용하면 기본 배열의 끝을 쉽게 찾을 수 있으며 매크로 솔루션과 달리 실수로 포인터에 적용하면 동작이 중단되는 대신 컴파일 오류가 발생합니다.

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)로 대체합니다. 비록 특정 버전의 arraysize가 뭔가 나쁜 일을 할 수 있는 특별한 경우가 있다는 것을 기억하지만(자세한 내용은 즉시 기억할 수 없어서 죄송합니다).그러나 올바르게 작동하는 경우가 많습니다.

작동하지 않는 경우는 "배열"이 실제 배열이 아닌 실제로 포인터일 때입니다.또한 배열이 함수에 전달되는 방식(첫 번째 요소에 대한 포인터로 변환)으로 인해 서명이 배열처럼 보이더라도 함수 호출에서는 작동하지 않습니다. some_function(string parameter[]) 정말이야 some_function(string *parameter).

Boost::Assign을 사용해야 한다는 Craig H의 답변을 찬성하려고 시도했지만 담당자가 없습니다.

나는 Andrei Alexandrescu가 읽은 첫 번째 기사에서 비슷한 기술을 접했습니다. C/C++ 사용자 저널, 16권, 9호, 1998년 9월, 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() 기능.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top