我有一個IP地址列表/數組作爲字符串。我需要確定這個數組中是否有重複項並記錄錯誤。該陣列大約20個元素。什麼是識別重複的有效方法?有效識別C++中字符串數組中重複項的算法
1
A
回答
2
- 排序原始陣列
- 迭代過排序後的數組,並且計數不同的值
- 創建具有從原始到新陣列(2)
- 複製值的大小新的數組,跳過重複
pseudo in bash:
[[email protected] ~]$ cat 1.txt
1
2
3
66
1
1
66
3
7
7
7
7
26
[[email protected] ~]$ cat 1.txt | sort | uniq
1
2
26
3
66
7
[[email protected] ~]$ cat 1.txt | sort | uniq | wc -l
7
+0
錯誤的問題? – 2014-12-07 13:23:14
+1
不,只是懶得寫C++代碼,而是給這個人一個大概的想法...... :) – elcuco 2014-12-07 13:25:39
+0
恐怕不會削減它。有人可能會交出一本C++書作爲答案,呵呵? – 2014-12-07 13:26:13
2
您可以使用map<string, int>
標記使用的地址並在地址首次出現:
void check_dups(const std::vector<std::string>& addresses) {
std::map<std::string, int> seen;
for (int i=0,n=addresses.size(); i<n; i++) {
std::map<std::string, int>::iterator it = seen.find(addreses[i]);
if (it == seen.end()) {
// Never used before, mark the position
seen[addresses[i]] = i;
} else {
// Duplicated value, emit a warning
std::cout << "Duplicate address at index " << i <<
" (present already at index " << it->second << ")\n";
}
}
}
0
這裏有3點合理有效的方式,從我的頭頂:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
// returns a sorted, de-duplicated copy
std::vector<std::string> de_duplicated(std::vector<std::string> vec)
{
std::set<std::string> interim { vec.begin(), vec.end() };
vec.assign(interim.begin(), interim.end());
return vec;
}
// sorts and de-duplicates in place
void de_duplicate(std::vector<std::string>& vec)
{
std::sort(std::begin(vec), std::end(vec));
auto current = std::begin(vec);
do {
auto last = std::end(vec);
current = std::adjacent_find(current, last);
if (current != last) {
auto last_same = std::find_if_not(std::next(current),
last,
[¤t](const std::string& s) {
return s == *current;
});
current = vec.erase(std::next(current), last_same);
}
} while(current != std::end(vec));
}
// returns a de-duplicated copy, preserving order
std::vector<std::string> de_duplicated_stable(const std::vector<std::string>& vec)
{
std::set<std::string> index;
std::vector<std::string> result;
for (const auto& s : vec) {
if (index.insert(s).second) {
result.push_back(s);
}
}
return result;
}
using namespace std;
int main() {
std::vector<std::string> addresses { "d", "a", "c", "d", "c", "a", "c", "d" };
cout << "before" << endl;
std::copy(begin(addresses), end(addresses), ostream_iterator<string>(cout, ", "));
cout << endl;
auto deduplicated = de_duplicated(addresses);
cout << endl << "sorted, de-duplicated copy" << endl;
std::copy(begin(deduplicated), end(deduplicated), ostream_iterator<string>(cout, ", "));
cout << endl;
deduplicated = de_duplicated_stable(addresses);
cout << endl << "sorted, stable copy" << endl;
std::copy(begin(deduplicated), end(deduplicated), ostream_iterator<string>(cout, ", "));
cout << endl;
de_duplicate(addresses);
cout << endl << "sorted, de-duplicated in-place" << endl;
std::copy(begin(addresses), end(addresses), ostream_iterator<string>(cout, ", "));
cout << endl;
return 0;
}
相關問題
- 1. Bash:識別數組中的重複字符串
- 2. 識別VB數組中的重複項
- 3. 簡單的方法來識別數組中重複的字符串? (PHP)
- 4. 如何計算字符串數組中的重複項?
- 5. 在c#中字符串未被識別爲有效的DateTime?
- 6. 識別字符串中相鄰重複字符的發生(python)
- 7. 用c計算字符串中字符的重複次數
- 8. 重複識別算法
- 9. 修復字符串中的重複項和無效數據
- 10. 從C中的數組中刪除重複的字/字符串
- 11. 識別node.js中字符串的數字
- 12. 數組字符串不被識別爲數組字符串
- 13. 字符識別(OCR算法)
- 14. 計算數組中字符串的出現次數,然後刪除重複項
- 15. 字符串未被識別爲有效的DateTime C#
- 16. C#錯誤「字符串未被識別爲有效的DateTime」
- 17. 在C++中無法識別的字符
- 18. 什麼算法有助於識別DOM中的重複序列?
- 19. 如何計算數組中的重複字符串?
- 20. 從字符串中刪除重複字符的算法
- 21. 如何有效識別大表中最流行的字符串?
- 22. 在2d字符串數組中查找重複的字符串
- 23. Android Studio中無法識別字符串
- 24. 在C++中複製字符串數組
- 25. 查找兩個數組中的所有重複項的算法
- 26. PHP識別和操縱多維數組中的重複項
- 27. 有沒有辦法在C#中訪問字符串數組中的字符串?
- 28. C# - 字符串未被識別爲有效日期時間
- 29. 在Pandas數據框中識別組中重複項的更好方法?
- 30. 加載字符串數組中字符串的有效地址?
使用的數據結構與超載而不是'=='和'<'運算符,並將IP存儲在一個集合中(最好是散列)。 – Columbo 2014-12-07 13:15:59
對它們進行排序,然後檢查相鄰的對。 – 2014-12-07 13:17:20
首先從字符串形式轉換可能是一個勝利。 – 2014-12-07 13:17:49