我想知道如何從容器中刪除重複的字符串,但忽略來自標點符號的單詞差異。給定一個字符串數組我如何刪除重複項?
例如,給定這些字符串:
爲什麼這樣做,我們在這裏,我們在這裏?
我想獲得這個輸出:
我們爲什麼在這裏?
我想知道如何從容器中刪除重複的字符串,但忽略來自標點符號的單詞差異。給定一個字符串數組我如何刪除重複項?
例如,給定這些字符串:
爲什麼這樣做,我們在這裏,我們在這裏?
我想獲得這個輸出:
我們爲什麼在這裏?
算法:
使用std::string
了你的話。 這可以讓你做到以下幾點:
std::string word;
while (data_file >> word)
{
}
使用std::vector
包含你的話(雖然你可以使用std::list
爲好)。 std::vector
動態增長,所以你不必擔心如果你選擇了錯誤的大小重新分配。
要附加到std::vector
,請使用push_back
方法。
比較std::string
,使用operator==
:
std::string new_word;
std::vector<std::string> word_list;
//...
if (word_list[index] == new_word)
{
continue;
}
所以you have said你知道如何來標記一個字符串。 (如果你不花時間在這裏:https://stackoverflow.com/a/38595708/2642059)所以我假設我們得到了一個vector<string> foo
,其中包含可能帶有標點符號的單詞。
for(auto it = cbegin(foo); it != cend(foo); ++it) {
if(none_of(next(it), cend(foo), [&](const auto& i) {
const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i));
return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second));
})) {
cout << *it << ' ';
}
}
值得注意這裏,你沒有給我們如何處理這樣的話規則「下」,「downvote」和「downvote」這種算法中假設1 st 2是相等的。你也沒有給我們規定如何處理的規則:「爲什麼,我們在這裏,我們這裏?」這個算法總是返回最後的重複,所以輸出結果是「我們爲什麼在這裏?」
如果這個算法的假設並不完全符合您的喜好,請留下我的評論,我們將努力讓您對此代碼感到滿意,以便您可以進行所需的調整。
我只是一個初學者。所以我會試着去理解代碼。謝謝你的回覆。 – Shubham
@Shubham我鼓勵你花一些時間,因爲我相信這是你的問題的最佳解決方案。我已經提供了Live示例,您可以使用這些示例進行嘗試。讓我知道是否有任何具體的事情可以向我解釋。 –
[Tokenize string。](https://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c) – Mahesh
[最優雅的方式分裂字符串?](https:// stackoverflow .com/questions/236129/most-elegant-way-to-split-a-string) –
@Leonardo你能告訴我怎麼做嗎? – Shubham