2013-03-02 1 views
0

안녕하세요, 배열 (사용자 입력 기반)을 x (사용자 입력에서 제외)으로 만들고 싶습니다. 내가 그것을하고 있다고 생각하는 방식은 for 루프가 n 반복을 수행하고 루프 내부에 x을 묻는 것입니다. 문제는 내가, 내가 좋아하는 뭔가를 생각하고 있었다 변수 n 사용하여 배열의 이름을하는 방법을 잘 모르겠어요입니다 :C++ : for 루프 반복자의 이름을 가진 배열을 동적으로 작성하십시오.

cout << "Enter n: "; 
cin >> n 

for (i = 0; i < n; i++) 
{ 
    cout << "Enter x: "; 
    cin >> x; 

    double*array+i; 
    array+i = new double[x] 
} 

정리해 내 질문은 : 당신은/이름 C에서 변수를 사용하여 배열을 만들 수 있습니다 ++ ?

+2

C++에서는이 작업을 수행 할 수 없습니다. 기본적으로 배열 배열을 생성해야합니다 (또는 C++이기 때문에'vector'의'vector's) – Joe

+1

* "for 루프 반복자의 이름이 지정된 배열"* - 왜 특정 이름의 배열이 필요합니까? 이것은 옳은 일처럼 들리지 않습니다. 'std :: vector >'을 사용하면됩니다. – LihO

+0

나는 당신이하려는 것을 이해하고 있는지 잘 모르겠습니다. C++을 사용하고 있다면'std :: vector > myMatrix'를 사용하면 내부 배열의 항목에 접근 할 수 있습니다 : myMatrix [x] [y]'. 고정 크기 배열을 사용하려면 MxN 행렬을 만드는'std :: array , M> myMatrix'를 사용할 수 있습니다. http://en.cppreference.com/w/를 사용하여 이러한 컨테이너 작업 방법을 이해하십시오. –

답변

1

아쉽게도 C++에서는이 작업을 수행 할 수 없습니다. 이런 식으로 뭔가를 시도 ...

std::cout << "Enter n: "; 
std::cin >> n 

std::vector<std::vector<double> > arrays(n); 

for (std::size_t i = 0; i < n; i++) 
{ 
    std::cout << "Enter x: "; 
    std::cin >> x; 

    arrays[i].reserve(x); 
} 

reserve

만 할당하지만, std::vector의 개체를 구성하지 않는다; 그것들을 구성하려면 resize을 사용하십시오.

추 신 : using namespace std을 사용하지 마십시오. 코드를 읽고 디버그하기가 더 어려워집니다.

+0

+1, 크기를 조정하기 위해 예약을 변경합니다. 예 : 용량이 아닌 용량 만 변경하십시오. – sellibitze

0

다음은 세 가지 솔루션입니다. 첫 번째는 예제 코드에 가장 가깝고 두 번째는 범위 내에서 배열 요소를 올바르게 검색 할 수 있도록 개선 된 것이고 세 번째 이유는 vector으로 더 나은 서비스를 제공하는 이유입니다 .

해결 방법 1 : 당신이 당신의 루프 반복자에 의해 구별 이름이 당신의 배열을 원하는처럼

것 같습니다. Joe가 말했듯이 배열의 배열을 가질 수 있으므로 내부 배열의 이름은 array [0], array [1], ..., array [n - 1]입니다. 이것은 포인터를 두 번 사용하여 얻을 수 있습니다. 각 내부 포인터는 동적으로 double 배열을 할당하는 데 사용됩니다. 동적으로 할당 된 메모리를 삭제하는 것을 잊지 마십시오.

#include <iostream> 
int main() 
{ 
    unsigned int n; 
    std::cout << "Enter number of arrays: "; 
    std::cin >> n; 
    double** array = new double*[n]; 

    for (int i = 0; i < n; ++i) 
    { 
     unsigned int size; 
     std::cout << "Enter size of array " << i << ": "; 
     std::cin >> size; 
     array[i] = new double[size]; 
     for (int j = 0; j < size; ++j) 
     { 
      int element; 
      std::cout << "Enter element " << j << " of array " << i << ": "; 
      std::cin >> element; 
      array[i][j] = element; 
     } 
    } 

    for (int i = 0; i < n; ++i) 
    { 
     delete [] array[i]; 
    } 
    delete[] array; 
    return 0; 
} 

이 용액을 2 :

그러나, 전술 한 코드와 함께, 각각의 내부 배열의 요소를 액세스하는 문제가된다. 이 방법으로 생성 한 각 내부 배열의 크기를 외우지 않으면 범위를 벗어나는 내용에 액세스 할 수 있습니다. 따라서이 코드를 업데이트하면 또 다른 배열을 추가하는 것이므로 sizeOfInnerArrays이라고하며 각 요소 i은 내부 배열 array[i]의 크기를 추적합니다. 다음 업데이트의 :

#include <iostream> 
    int main() 
    { 
     unsigned int n; 
     std::cout << "Enter number of arrays: "; 
     std::cin >> n; 
     double** array = new double*[n]; 
     unsigned int* sizeOfInnerArrays = new unsigned int[n]; 

     for (int i = 0; i < n; ++i) 
     { 
      std::cout << "Enter size of array " << i << ": "; 
      std::cin >> sizeOfInnerArrays[i]; 
      array[i] = new double[sizeOfInnerArrays[i]]; 
      for (int j = 0; j < sizeOfInnerArrays[i]; ++j) 
      { 
       int element; 
       std::cout << "Enter element " << j << " of array " << i << ": "; 
       std::cin >> element; 
       array[i][j] = element; 
      } 
     } 

     //prints out each array as curly-brace enclosed sets of doubles 
     for (int i = 0; i < n; ++i) 
     { 
      std::cout << "{"; 
      for (int j = 0; j < sizeOfInnerArrays[i] - 1; ++j) 
      { 
       std::cout << array[i][j] << ", "; 
      } 
      std::cout << array[i][sizeOfInnerArrays[i] - 1] << "}" << std::endl; 
     } 

     // free dynamically allocated memory 
     for (int i = 0; i < n; ++i) 
     { 
      delete [] array[i]; 
     } 
     delete[] array; 
     delete[] sizeOfInnerArrays; 

     return 0; 
    } 

해결 방법 3 :

그러나,이 너무 복잡하면 조 그 데이터 멤버를 추적, 제안, vector처럼 용기를 사용하는 것이 더 낫다 그래서 그 크기. 당신이 C++로 프로그래밍되어 있기 때문에

#include <iostream> 
#include <vector> 

int main() 
{ 
    unsigned int n; 
    std::cout << "Enter number of vectors: "; 
    std::cin >> n; 
    std::vector<std::vector<double> > myVec; 
    //^space between closing angle brackets not needed 
    // if using C++11 conforming compiler 

    for (int i = 0; i < n; ++i) 
    { 
     unsigned int size; 
     std::cout << "Enter size of vector " << i << ": "; 
     std::cin >> size; 
     std::vector<double> temp; 
     temp.reserve(size); 
     for (int j = 0; j < size; ++j) 
     { 
      double value; 
      std::cout << "Enter next value of vector " << i << ": "; 
      std::cin >> value; 
      temp.push_back(value); 
     } 
     myVec.push_back(temp); 
    } 

    for (int i = 0; i < myVec.size(); ++i) 
    { 
     std::cout << "{"; 
     for (int j = 0; j < myVec.at(i).size() - 1; ++j) 
     { 
      std::cout << myVec.at(i).at(j) << ", "; 
     } 
     std::cout << myVec.at(i).back() << "}" << std::endl; 
    } 

    return 0; 
} 
+0

new [] 및 delete []는 지난 세기 sooo입니다. – sellibitze

+0

OP의 예제 코드와 가장 근접하기 때문에 정규 배열을 먼저 사용했습니다. 추가 솔루션을 추가로 편집했습니다. 두 번째 솔루션에서는 범위 내의 요소를 검색하기 위해 다른 배열의 크기를 추적하는 배열을 추가했습니다. 이것은 세 번째 해법에서 벡터를 사용할 인센티브를 설정합니다. – CodeBricks

0

, 당신은 STL 컨테이너를 사용해야합니다 (특히 std::vector) 대신 C 스타일 배열.

런타임에 생성 된 문자열을 사용하여 배열에 액세스해야하는 경우, 당신은 그래도 꽤 미친 아이디어 인 std::map< std::string, std::vector<double> >을 사용할 수

typedef std::vector<double> MyVector; 
std::map<std::string, MyVector> myVectors; 

// create an array: 
std::string arrayName; 
arrayName = std::string("someArray");  // could be: std::cin >> arrayName; 
myVectors[arrayName] = MyVector(10, 1.23); // new vector of size 10 

std::cout << myVectors["someArray"][4];  // prints 1.23 

내가 정확히 무엇인지 잘 모르겠어요 당신이 달성하고자하는 것이지만, 가장 적절한 해결책이 더 있습니다. 이름을 통해 이러한 배열에 액세스해야합니까? 나는 보통 std::vector< std::vector<double> >이 여기에서 충분하다는 것을 확신한다.

관련 문제