我是一名C++程序員。我正在嘗試Eratosthenes的篩子。我的程序正在快速計算多達100萬的素數,並且與Sieve實際相符。但是,我怎麼知道是否有更好的代碼編寫方式,或者我的編碼方式不好。我如何知道我的代碼方法好還是不好?
很多人都說google嘗試google,並將其與其他解決方案進行比較。我不支持這一點,因爲衆所周知,每個程序員都有不同的解決問題的方法。
鏈接到我的代碼:http://pastebin.com/qkrBpd29
我是一名C++程序員。我正在嘗試Eratosthenes的篩子。我的程序正在快速計算多達100萬的素數,並且與Sieve實際相符。但是,我怎麼知道是否有更好的代碼編寫方式,或者我的編碼方式不好。我如何知道我的代碼方法好還是不好?
很多人都說google嘗試google,並將其與其他解決方案進行比較。我不支持這一點,因爲衆所周知,每個程序員都有不同的解決問題的方法。
鏈接到我的代碼:http://pastebin.com/qkrBpd29
編輯:我只是意識到你的代碼並沒有真正使用任何C++的功能,只有std::cin
和std::cout
。它基本上是C代碼。我在下面的回答是假設你正在使用C++。
從看你的代碼我會建議,考慮內存管理。你用沒有破壞的資源編寫對象。當這些函數應該是類函數時,您正在編寫接受節點對象的全局函數。
瞭解智能指針std::unique_ptr
和std::shared_ptr
從#include <memory>
以及適當地使用它們的位置。
如果可能的話,每當你需要堆上的東西時,在棧上聲明一些東西以確保它在事後被清除,這就是所謂的RAII。 (旁註,RAII,是一直堅持一個可怕的名字,不用擔心它代表什麼,因爲它不是很描述。)
閱讀Effective C++ by Scott Meyers和Effective Modern c++ Scott Meyers.
也有從cppcon上一些偉大的演講YouTube上。
謝謝。我以前也曾經遇到過這個問題,使用類跳過了我的想法。謝謝 –
讓我感到意外的是C++的結構和類具有幾乎相同的含義。我很驚訝地發現,在C++中,struct可以具有析構函數,構造函數,繼承,函數,私有成員。 唯一的區別是默認的可見性。類成員和方法默認是私有的,結構默認是公共的。 –
如果我理解正確的話,那麼你的實現是基於列表。這不是很好,因爲在刪除之前你必須找到正確的位置。我認爲這是更簡單的使用數組來代替(對不起,java代碼):
boolean[] isNotPrime = new boolean[MAX + 1];
// we know 2 is prime, it's enough to look at the odd numbers
primes.add(2); // list of primes
for (int i = 3; i < isNotPrime.length; i += 2) {
if (isNotPrime[i])
continue;
primes.add(i);
for (int j = 3 * i; j < isNotPrime.length; j += 2 * i)
isNotPrime[j] = true;
}
沒有代碼是完美的,也有做的事情,但問自己或他人的下列問題應該可以幫助你很多正確的方法。
struct Node{
int a;
Node* linkl;
Node* linkr;
}*top,*rear;
頂部和後部是全局變量。不好。全局需要非常少見,你在這裏不需要它們。
關於你的代碼的評論你可以在[代碼評論](http://codereview.stackexchange.com) – celtschk
它工作嗎?代碼是否可讀?它可維護嗎?那麼你的解決方案很好。很可能你總是會回頭看看你在6個月時間內編寫的代碼,並用新發現的知識做一些稍微不同的事情。並不是所有你寫的代碼都需要是「完美的做事方式」。這就是說,如果你正在尋找代碼的一些反饋,看看[代碼審查SE](http://codereview.stackexchange.com/) – Tas
寫你的代碼。離開並做其他與此代碼無關的項目(可以包括其他軟件項目,翻新房屋或任何其他項目,只要您完全不考慮此代碼)。六個月後,清除你的代碼。如果您發現代碼清晰易懂,就會通過。如果你發現代碼亂七八糟,那不是很好的代碼。 – Peter