2016-11-05 21 views
9

Input: 5Làm cách nào để nhập các phần tử trong một mảng KHÔNG nhập vào n? (C++)

long long n; 
cin>>n; 
long long a[n]; 
for(long long i=0;i<n;i++){ 
    cin>>a[i]; 
} 

Làm thế nào để các yếu tố đầu vào của mảng mà không cần nhập n?

Đây là những gì tôi tìm kiếm:

Input: 1,2,3,4,5

cout << a[0] 

đầu ra:

+0

Xem http://en.cppreference.com/w/cpp/container/vector (cụ thể, ví dụ ở cuối trang) – OMGtechy

+0

bạn có suy nghĩ về giới hạn trên của mảng không thì tôi có thể giúp bạn. – NeoR

+0

Không, không. Bạn không hiểu. Tôi muốn * cin * các yếu tố mà không có * cin * n chính nó. – Nson

Trả lời

7

vòng lặp lọc đầu vào tiêu chuẩn trong C++ là while(cin >> a) - điều này sẽ đọc cho đến khi có là không có đầu vào nhiều hơn, hoặc những điều xấu khác xảy ra:

#include <vector> 
#include <iterator> 
#include <iostream> 
int main() { 
    std::vector<int> nums; 
    while (std::cin >> a) { 
    nums.push_back(a); 
    } 
    std::copy(nums.begin(), nums.end(), ostream_iterator<int>{cout, " "}); 
} 

Bạn cũng có thể sử dụng một lớp lót với vòng lặp đầu vào - con đường ngắn nhất để đọc các yếu tố trong một vector:

#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 

int main() { 
    std::vector<int> nums(std::istream_iterator<int>(std::cin), {}); 
    std::copy(nums.begin(), nums.end(), std::ostream_iterator<int>{std::cout, " "}); 
} 

Xem Ideone example here

Giả sử tuy nhiên bạn muốn bỏ qua tất cả sự tuyệt vời này của C++, IMHO không khuyến khích mạnh mẽ, bạn chỉ có thể:

#include <iostream> 
int main() { 
    const int MAX_SIZE = 100; 
    int nums[MAX_SIZE]; 
    int a; 
    int i=0; 
    while (std::cin >> a) { 
    nums[i++] = a; 
    } 

    // do your output 
} 

Lưu ý rằng bạn sẽ:

  1. cần phải đoán MAX_SIZE,
  2. hoặc tự xử lý phân bổ lại một khi bạn đọc những yếu tố hơn MAX_SIZE;

Do đó: sử dụng std::vector !!

4

Sử dụng std::vector<long long> a; thay thế.

Sau đó, sử dụng long long temp;, cin >> temp;a.push_back(temp);.

Điều này có nghĩa là vectơ sẽ tự động tăng khi bạn thêm nhiều dữ liệu hơn. Có một cảm giác thông minh hơn cách, nhưng cách của tôi mang lại lợi thế là rõ ràng.

Những ngày này những con mèo tuyệt vời không lo lắng về việc lặp lại push_back khi chúng tin tưởng vào việc thực hiện thư viện chuẩn C++ để giữ bộ nhớ đẹp và không bị phân mảnh cho bạn. Nhưng nếu bạn phải, thì std::vector không cho phép bạn đặt công suất ban đầu thông qua phương thức reserve của mình: bạn vẫn có thể phát triển vectơ của mình vượt ra ngoài nếu muốn.

+0

Tôi nghĩ rằng câu hỏi là nhiều hơn về cách bạn đọc các yếu tố mà không cần nhập số trước, thay vì cách bạn lưu trữ chúng? –

+0

Có thể bạn đã đúng. Câu trả lời của bạn là khá posh, cộng với một. – Bathsheba

1

Bạn cần biết nơi đầu vào kết thúc. Trong trường hợp của bạn, có vẻ như đầu vào phù hợp trên một dòng. Bạn có thể đọc dòng đó, xây dựng một dòng chuỗi từ nó, và đọc mục bằng dấu phẩy tách ra khỏi nó như sau:

string line; 
getline(cin, line); 
istringstream iss(line); 
vector<long long> a; 
long long tmp; 
while (iss >> tmp) { 
    a.push_back(tmp); 
    iss.ignore(1, ','); 
} 

Demo.

Lưu ý cách sử dụng trên một std::vector<long long> thay vì một mảng. Cách tiếp cận này cho phép bạn quản lý dung lượng lưu trữ cho dữ liệu của mình bằng một cú gọi đơn giản là push_back và biết bạn đã nhập bao nhiêu dữ liệu bằng cách kiểm tra size().

1

Có một vài cách. Điều quan trọng nhất là nếu bạn không biết số lượng giá trị bạn cần để sử dụng vùng chứa có thể phát triển khi cần. Cho rằng bạn có std::vector (như đã đề cập bởi những người khác rồi).

Cách ngây thơ để sử dụng một vector và đọc đầu vào sẽ là một cái gì đó giống như

std::vector<int> vector; 
while (!std::cin.eof()) 
{ 
    int value; 
    std::cin >> value; 
    vector.push_back(value); 
} 

But the above loop is wrong!

Sử dụng một cách tiếp cận tương tự như vòng lặp ở trên (nhưng làm việc) sẽ là một cái gì đó giống như

std::vector<int> vector; 
int value; 
while (std::cin >> value) 
{ 
    vector.push_back(value); 
} 

Tuy nhiên C++ có nhiều chức năng tiện ích tốt đẹp và các lớp học có thể làm cho nó thậm chí còn đơn giản hơn.

Sử dụng standard algorithm chức năng std::copy và một vài iterator người giúp đỡ (std::istream_iteratorstd::back_inserter), chúng tôi có thể viết

std::vector<int> vector; 
std::copy(std::istream_iterator<int>(std::cin), 
      std::istream_iterator<int>(), 
      std::back_inserter(vector)); 

Nó có thể, như đã nói bởi paul-g, thậm chí còn đơn giản hơn vì có một vector constructor overload mà phải mất một phạm vi iterator, vì vậy tất cả những gì thực sự cần thiết là

std::vector<int> vector(std::istream_iterator<int>(std::cin), 
         std::istream_iterator<int>()); 
+1

Tại sao hiển thị sai cách để làm điều đó? Ngoài ra, tại sao sử dụng backstream + backstream dài hơn khi bạn chỉ có thể sử dụng 'std :: vector nums (std :: istream_iterator (std :: cin), {});'? –

Các vấn đề liên quan