2013-06-12 74 views
0

我將字符串標記爲包含單獨元素的矢量。接下來,我想計算這個向量子集中字符串的出現次數。這工作時,我想簡單地使用與整個載體,由guide提到:計算矢量子集中的出現次數

cout << std::count (tokens.begin(), tokens.end(), 20); 

這將算20所有出現。

使用數組,可以使用一個子集(從導):

int myints[] = {10,20,30,30,20,10,10,20}; // 8 elements 
int mycount = std::count (myints, myints+8, 20); 

的問題是,我想使用矢量的一個子集,而且我試過幾件事情,但他們全部不起作用:

// Note: Here I count "NaN", which does not change the story. 
std::count (tokens.begin(start[i]), tokens.end(end[i]), "NaN")   
std::count (tokens.begin() + start[i], tokens.end() + end[i], "NaN") 
std::count (tokens + start[i], tokens + end[i], "NaN") 

如何統計矢量子集中的出現次數?

下面是工作示例的上下文中:

#include <iostream> 
#include <string> 
#include <sstream> 
#include <algorithm> 
#include <iterator> 

int main() { 
    using namespace std; 
    string line = "1 1 1 1 1 NaN NaN NaN"; 
    std::vector<int> start = {1,2,3,4}; 
    std::vector<int> end = {1,2,3,4};  
    istringstream iss(line); 
    vector<string> tokens; 
    copy(istream_iterator<string>(iss), 
     istream_iterator<string>(), 
     back_inserter<vector<string> >(tokens)); 
    for (int i = 0; i < 3; i++) 
    { 
     cout<<std::count(tokens.begin() + start[i], tokens.end() + end[i], "NaN"); 
    } 
} 

Error: Segmentation fault 
+0

您不能將一個正數添加到'tokens.end()'。你真的想搜索什麼樣的範圍? – aschepler

+0

啊,是的,當然。它應該是'tokens.begin()+ end [i]'。 – PascalVKooten

+0

(在'start == end'的例子中,你計入空範圍並且總是得到零)。 – aschepler

回答

2

添加整數向量迭代作品就像添加的整數指針。所以,你可以爲實例來:

cout << std::count (tokens.begin() + 5, tokens.begin() + 10, 20); 

要計算20-S究竟有多少在令牌與指標[5, 10)位置。

+0

在我的例子中,你可以看到我這麼做。任何想法,爲什麼我得到錯誤呢? – PascalVKooten

+0

您正在添加到結束迭代器。你永遠不應該那樣做。相反,像我一樣,將子數組的大小添加到您添加到開始迭代器的值中。 –

+0

這樣一個簡單的錯誤,卻讓我失望了一個小時。謝謝! – PascalVKooten