你可以使用std :: find_if。
bool not_0(char c)
{
return c != 0;
}
char *next = std::find_if(ptr + 100, ptr + 200, not_0);
if (next == ptr + 200)
// all 0's
您還可以使用粘合劑除去遊離功能(雖然我覺得粘合劑是很難讀):
char *next = std::find_if(ptr + 100, ptr + 200,
std::bind2nd(std::not_equal_to<char>(), 0));
蕩,我只是注意到請求不被字節做到這一點字節。儘管隱藏,find_if仍然會逐字節地執行。你將不得不一一做這個,儘管使用更大的類型會有所幫助。這是我的最終版本。
template <class T>
bool all_0(const char *begin, const char *end, ssize_t cutoff = 10)
{
if (end - begin < cutoff)
{
const char *next = std::find_if(begin, end,
std::bind2nd(std::not_equal_to<char>(), 0));
return (next == end);
}
else
{
while ((begin < end) && ((reinterpret_cast<uintptr_t>(begin) % sizeof(T)) != 0))
{
if (*begin != '\0')
return false;
++begin;
}
while ((end > begin) && ((reinterpret_cast<uintptr_t>(end) % sizeof(T)) != 0))
{
--end;
if (*end != '\0')
return false;
}
const T *nbegin = reinterpret_cast<const T *>(begin);
const T *nend = reinterpret_cast<const T *>(end);
const T *next = std::find_if(nbegin, nend,
std::bind2nd(std::not_equal_to<T>(), 0));
return (next == nend);
}
}
這樣做首先檢查數據是否足夠長,以使其值得更復雜的算法。我不是100%肯定這是必要的,但你可以調整最低限度的必要條件。
假設數據足夠長,它首先將開始和結束指針對齊,以匹配用於比較的類型的對齊方式。然後它使用新類型來檢查大部分數據。
我會建議使用:
all_0<int>(); // 32 bit platforms
all_0<long>(); // 64 bit LP64 platforms (most (all?) Unix platforms)
all_0<long long>() // 64 bit LLP64 platforms (Windows)
也許我誤解了這個問題,但是每當你想看'n'項目時,你都在看O(n)。在小於O(n)的時間內檢查'n'項目沒有魔法巫術方法。 – 2010-02-09 01:34:28
我知道,但是如果我能夠降低N,最終的價值總是會下降:)寶貴的時間,我正在和一些朋友進行一次小小的比賽,看看誰的速度更快。 – fmsf 2010-02-09 01:37:04
如果你像「char matrix [100] [100];」那樣初始化矩陣,它們不能保證全部爲0.嘗試「char matrix [100] [100] = {0};」 – Ponkadoodle 2010-02-09 01:57:02