2012-09-30 95 views
2

我怎樣才能找到確定的數組成員的大小。例如,我聲明我的陣列與此:查找數組中某些元素的大小?

string myStrArray[200] = { 
    "My first string", 
    "My second string", 
    "My last string" 
} 

在該代碼中,有197個未使用的元件(或我明白如此)。我想通過代碼(如sizeof())找到此數組的某些元素(3個元素)。我怎樣才能做到這一點?

+1

使用所有的元素,只有最後197是空的。 – jrok

+0

你想要什麼,這些元素的指標?或者可以假設他們將永遠是第一個? – juanchopanza

回答

4

你不行。但是,您可以先將數組調零,然後計算非零元素的數量,但這需要數組包含string*而不是string

你可以使用一個向量來代替,例如:

std::vector<std::string> v; 
v.reserve(200); // Allocate space for 200 
v.push_back("My first string"); 
v.push_back("My second string"); 
v.push_back("My last string"); 
v.size(); // Returns 3 
+0

第一行是錯誤的。 RHS上不需要「新」。並且調用一個變量'vector'正在尋求麻煩! – juanchopanza

+0

@juanchopanza你是對的。感謝您指出了這一點。複製並粘貼失敗。 – akton

+0

@CharlesBailey你是對的。正如我上面提到的,這是一個複製和粘貼失敗,但感謝您指出。 – akton

1

有沒有辦法(至少在C++中,我所知道的)如何在數組的許多元素被確定爲讀出。你必須通過你自己的變量來實現它(當你「添加」元素時增加它,當「刪除」時遞減)。你也可以使用std :: vector。 vector.size()返回矢量的大小。

+0

有辦法。您只需檢查與「'」'相等或不相等的元素。 – juanchopanza

+0

它的工作原理,但只適用於新創建的陣列。如果它被多次編輯,這個方法並不是最好的。除此之外,它具有線性複雜性。 – uicus

1

如果你肯定知道所有的非空字符串的是開頭,那麼你可以使用std::find

int n = std::find(myStrArray, myStrArray + 200, "") - myStrArray; 

其實,你可以使用std::lower_bound,這是一個二進制搜索等會比std::find更有效率。但是你需要一個奇特的比較函數。如果lhs非空且rhs爲空,則返回true,否則返回false。

如果非空元素分佈較爲稀疏,你將要使用std::count

int n = 200 - std::count(myStrArray, myStrArray + 200, ""); 
0

不能使用sizeof()來找出多少元素數組中的「裝」,你是在數組中存儲std :: string(我假設atleast),所有元素的大小相同(因爲std :: string在初始化後不會改變大小)。實際上沒有對象改變C++的大小,至少不是根據sizeof(); sizeof()將始終返回類型相同的數字,因爲它返回靜態類型的大小。

如果你考慮在陣列中的位置被「裝」當字符串不等於「」,那麼你可以使用下面的代碼來計算串的數量:

for (int i = 0; i < 200; ++i) 
    if (!myStrArray[i].empty()) ++count; 

我會建議使用一個std ::矢量<>代替,但(這是幾乎總是一個好主意):

std::vector<std::string> my_strings = { "a", "b" }; // requires C++11 in C++03 use push_back() 
std::cout << "Number of strings: " << my_strings.size() << std::endl; 
相關問題