2012-03-08 35 views
18

Tôi biết tôi có thể làm điều này trong C++:C++ chuỗi mảng khởi

string s[] = {"hi", "there"}; 

Nhưng là có anyway để delcare một mảng theo cách này mà không delcaring string s[]?

ví dụ:

void foo(string[] strArray){ 
    // some code 
} 

string s[] = {"hi", "there"}; // Works 
foo(s); // Works 

foo(new string[]{"hi", "there"}); // Doesn't work 
+3

tại sao bạn sử dụng mảng được phân bổ động theo kiểu c? Tôi sẽ đề nghị bạn sử dụng 'std :: vector' thay thế. Khi sử dụng C++ 11, bạn có thể tạo chúng bằng cách sử dụng danh sách khởi tạo, ví dụ: 'void foo (vector ); foo ({"hi", "there"}); 'nên hoạt động trong C++ 11 – Grizzly

Trả lời

18

Trong C++ 11 bạn có thể. Một lưu ý trước: Không new mảng, không cần thiết cho điều đó.

Đầu tiên, string[] strArray là lỗi cú pháp, phải là string* strArray hoặc string strArray[]. Và tôi cho rằng đó chỉ là vì ví dụ mà bạn không vượt qua bất kỳ tham số kích thước nào.

#include <string> 

void foo(std::string* strArray, unsigned size){ 
    // do stuff... 
} 

template<class T> 
using alias = T; 

int main(){ 
    foo(alias<std::string[]>{"hi", "there"}, 2); 
} 

Lưu ý rằng sẽ tốt hơn nếu bạn không cần phải vượt qua kích thước mảng làm tham số bổ sung và may mắn có cách: Mẫu!

template<unsigned N> 
void foo(int const (&arr)[N]){ 
    // ... 
} 

Lưu ý rằng điều này sẽ chỉ khớp với các mảng ngăn xếp, như int x[5] = .... Hoặc tạm thời, được tạo bởi việc sử dụng alias ở trên.

int main(){ 
    foo(alias<int[]>{1, 2, 3}); 
} 
4

Với sự hỗ trợ cho C++ 11 initializer liệt kê nó là rất dễ dàng:

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

using Strings = vector<string>; 

void foo(Strings const& strings) 
{ 
    for(string const& s : strings) { cout << s << endl; } 
} 

auto main() -> int 
{ 
    foo(Strings{ "hi", "there" }); 
} 

Thiếu đó (ví dụ như cho Visual C++ 10.0), bạn có thể làm những việc như thế này:

#include <iostream> 
#include <vector> 
#include <string> 
using namespace std; 

typedef vector<string> Strings; 

void foo(Strings const& strings) 
{ 
    for(auto it = begin(strings); it != end(strings); ++it) 
    { 
     cout << *it << endl; 
    } 
} 

template< class Elem > 
vector<Elem>& r(vector<Elem>&& o) { return o; } 

template< class Elem, class Arg > 
vector<Elem>& operator<<(vector<Elem>& v, Arg const& a) 
{ 
    v.push_back(a); 
    return v; 
} 

int main() 
{ 
    foo(r(Strings()) << "hi" << "there"); 
} 
+1

Quá dài dòng: sử dụng vòng lặp dựa trên dải ô:' cho (s tự động: chuỗi) cout << s << endl; ' – rwst

+0

@ rwst: Vâng, hôm nay. Cảm ơn. Tôi có thể sử dụng các trình lặp để hỗ trợ Visual C++ phổ biến trong năm 2012. Vòng lặp đơn giản mà bạn hiển thị có một chút không hiệu quả ở chỗ nó sao chép chuỗi nhưng (1) không đáng kể so với io trong vòng lặp và (2) nó không liên quan, vì nó không phải là những gì ví dụ này là về, và (3) một viết lại cho hiệu quả (không dạy thành ngữ xấu) là không khó hiểu. Vì vậy, đến năm 2015 tôi thấy không có lý do để giữ vòng lặp Iterator tôi đã sử dụng. Vui lòng sửa lỗi. :) –

+0

@rwst: OK tôi tự cập nhật nó. Ngoài ra kiểm tra xem ví dụ Visual C++ 10 thực sự biên dịch với VC10. Khi tôi nhìn vào nó bây giờ tôi không thể nhớ rằng VC10 hỗ trợ tài liệu tham khảo rvalue, nhưng, nó đã làm (ít nhất là mã biên dịch và tạo ra kết quả chính xác). –

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