2017-07-11 287 views
0

我在嘗試在矢量中查找多個相同元素時出現問題。我想每3個索引找到重複的元素。如果有重複,則接下來的2個元素進入一個新的向量。如何在std :: vector中查找多個元素

std::vector<std::wstring> wsBuf = {"one" , "three", "five", "two", "one","ten", "nine"};` 
std::vector<std::wstring> wsWriteFile; 
for(DWORD i = 0; i < wsBuf.size(); ++i) 
{ 
    std::vector<std::wstring>::iterator it = wsReadFile.begin(); //wsReadFile has an enumerated list 
    it = std::find(it, wsReadFile.end(), wsBuf[i]); 
    if(it != wsReadFile.end()) 
    { 
    DWORD index = std::distance(wsReadFile.begin(), it); 
    if(index < wsReadFile.size()) 
    { 
     wsWriteFile.push_back(wsReadFile[index]; 
     wsWriteFile.push_back(wsReadFile[index + 1]; 
     wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
    } 
} 

這隻會找到零索引而不是第二個。有沒有人有任何想法如何找到C++ 11函數的第二個索引?

我發現了一個辦法做到這一點沒有C++ 11個功能

`for(DWORD i = 0; i < wsBuf.size(); ++i) 
{ 
    DWORD j = 0; 
    do 
    { 
    if(wsBuf[i] == wsReadFile[j]) 
    { 
     wsWriteFile.push_back(wsReadFile[index]; 
     wsWriteFile.push_back(wsReadFile[index + 1]; 
     wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
    j+=3; 
    }while(j < wsReadFile.size()); 
}` 
+3

如果你想刪除*重複,然後'std :: sort'的向量,然後[std :: unique](http://en.cppreference.com/w/cpp/algorithm/unique )你有覆蓋。但是,從你的問題*完全不清楚你想要做什麼。 –

+0

可能重複[如何在std :: vector 中找到重複項並返回它們的列表?](https://stackoverflow.com/questions/17892896/how-to-find-duplicates-in-stdvectorstring-and-返回他們的列表) – Ron

+0

@JesperJuhl對不起,我編輯了我的迴應 –

回答

0

對於每個wsBuf,你只能叫find一次。這顯然發現......一個因素。

it = std::find(it, wsReadFile.end(), wsBuf[i]); 
if(it != wsReadFile.end()) 
{ 
    DWORD index = std::distance(wsReadFile.begin(), it); 
    if(index < wsReadFile.size()) 
    { 
    wsWriteFile.push_back(wsReadFile[index]; 
    wsWriteFile.push_back(wsReadFile[index + 1]; 
    wsWriteFile.push_back(wsReadFile[index + 2]; 
    } 
} 

它也沒有編譯,你錯過了一些) s。在將來,編寫並演示問題的代碼;如果你不知道這個問題,你不知道解決問題並不重要。

無論如何,你需要一個循環。我也想要邊界檢查。和更少的迭代器< - >索引轉換。更少的類型無關緊要。

auto it = std::find(wsReadFile.begin(), wsReadFile.end(), wsBuf[i]); 
while(it != wsReadFile.end()) 
{ 
    auto left = std::distance(it, wsReadFile.end()); 
    // don't copy past the end: 
    auto copy_end = it+(std::min)(left, decltype(left)(3)); 
    std::copy(it, copy_end, std::back_inserter(wsWriteFile)); 
    // find next: 
    it = std::find(copy_end, wsReadFile.end(), wsBuf[i]); 
} 
相關問題