Bạn có thư viện ut linh tinh của riêng mình không? Phần nào bạn tự hào nhất? [đóng cửa]


32

Tôi biết rằng nhiều người trong chúng ta duy trì thư viện cá nhân nhỏ bé của riêng mình với các công cụ và tiện ích mà chúng ta thường sử dụng.

Tôi đã có của tôi từ năm 16 tuổi nên nó đã phát triển đến một kích thước khá đáng kể. Một số nội dung tôi đã viết đã được thêm vào khung. Tôi đã viết một ít triển khai cây biểu hiện của riêng mình để sử dụng với các thuật toán di truyền từ lâu trước LINQ, điều mà tôi khá thích và tự hào vào thời điểm đó - tất nhiên bây giờ nó khá vô dụng. Nhưng gần đây tôi đã trải qua nó và nâng cấp lên .NET 4.0 và thu hút sự quan tâm.

Vì vậy, tôi tò mò về những gì bạn sử dụng thư viện của bạn cho. Có lẽ chúng ta có thể có được một số ý tưởng tuyệt vời dành cho các đoạn nhỏ hữu ích và chia sẻ chúng với nhau.

Vì vậy, câu hỏi của tôi là:

  • Bạn có một thư viện tiện ích linh tinh?
  • Phần nào bạn tự hào nhất và tại sao?

Cho một ví dụ về mã nếu bạn thích :-)


Dường như không ai có thể nâng cao câu trả lời ...
Joey Adams

@Jeyey phải không? Hiện nay 17 câu hỏi phiếu và 6 tổng phiếu trả lời.
Nicole

Tôi không thực sự thấy câu trả lời có giá trị nâng cao. Upvote có ý nghĩa gì với họ? Bản chất của câu hỏi là các câu trả lời chỉ nhận được "oh. Đẹp." loại phản ứng, và sau đó nó sẽ nâng cao tất cả mọi thứ hoặc không có gì cả. (. Và tôi không như upvoting mỗi câu trả lời chỉ là nguyên nhân gây ra nó ở đó Nếu không có gì khác, tôi ra khỏi số phiếu: P.)
Adam Lear

@Anna Lear, ok, bạn được miễn :)
Nicole

3
Bất kỳ tiện ích phong nha nên được đưa lên github và chia sẻ với thế giới. Sẽ không có ý nghĩa gì khi giữ nó ẩn nếu nó thực sự tốt.
Công việc

Câu trả lời:


27

Không.

Tôi đã thấy một số hiệu ứng ác mộng của hàng tá nhà phát triển, tất cả đều thêm các thư viện kiểu "produc.h" của riêng họ vào các dự án và biến nó thành một mớ hỗn độn khổng lồ về cách đặt tên và hành vi không nhất quán. Giống như PHP. Vì vậy, vì lý do đó tôi tránh làm điều đó.

Tôi tránh cần phải làm điều đó bằng cách sử dụng các môi trường lập trình cung cấp cho tôi gần như tất cả các công cụ và thư viện tôi cần trước bất cứ khi nào có thể, chẳng hạn như C # và python.


7
Tôi liên tục viết lại thư viện của mình cho mục đích tổ chức.
Tối đa

3
Các trường hợp gói utils đã biến thành cơn ác mộng không có nghĩa là tất cả đều xấu. Tôi không thể thấy làm thế nào bạn có thể tránh nó và không có nhiều mã trùng lặp vì nó. Và do đó, thử nghiệm tồi tệ hơn và hiệu quả thấp hơn.
Nicole

2
@Renesis: Các gói utils cũng thảm khốc như các câu lệnh goto. Chắc chắn, bản thân nó không tệ đến thế, nhưng dường như nó luôn luôn là một thảm họa sớm hay muộn. Đối với sao chép mã, nếu bạn thấy mình thực hiện một số nhiệm vụ tương tự trong hầu hết tất cả các dự án của mình, thì đối với một cái gì đó như python hoặc C #, những người khác cũng có thể đã làm điều đó và có lẽ đó là trong các thư viện tiêu chuẩn.
whatsisname

6
Theo kinh nghiệm của tôi, các kỹ sư có thư viện riêng của họ sẽ ưu tiên sử dụng nó trước hệ thống do một hệ thống cung cấp, vì vậy việc có thư viện cá nhân là không tốt. Tôi đã từng có một anh chàng hoàn toàn tin tưởng rằng chức năng 'strlen' của anh ta nhanh hơn chức năng do trình biên dịch cung cấp, bởi vì anh ta đã viết nó . Phải mất một minh chứng đơn giản về việc strlen là một vài hướng dẫn lắp ráp nội tuyến để anh ta thừa nhận rằng có lẽ những người khác có thể làm tốt hơn.
JBRWilkinson

4
@JBRWilkinson Quan điểm của bạn được thực hiện tốt. Không phải mọi lập trình viên đều phù hợp để phát triển mã chung.
Nicole

15

SmartFormat

Tiện ích yêu thích của tôi là tiện ích tôi đã viết - trình tạo / định dạng chuỗi đơn giản giúp dễ dàng biến dữ liệu thành chuỗi với ngữ pháp chính xác.

Ví dụ: hầu hết các lập trình viên xây dựng văn bản từ một mẫu: "There are {0} items remaining" nhưng điều này dẫn đến các lỗi ngữ pháp : "There are 1 items remaining".

Vì vậy, SmartFormat cho phép bạn viết : "There {0:is|are} {0} item{0:|s} remaining".

Bạn chỉ cần thay thế String.Format(...)với Smart.Format(...)và đó là nó!

Các SmartFormat code đang mã nguồn mở: http://github.com/scottrippey/SmartFormat/wiki


Điều này nhắc nhở tôi định dạng được sử dụng bởi java.text.MessageFormat.
barjak

@barjak Thú vị! Tôi đã dành một thời gian dài để nghiên cứu định dạng "có điều kiện" và không bao giờ tìm thấy bất cứ điều gì tương tự cho đến bây giờ! MessageFormatChoiceFormatlớp cho phép một cú pháp tương tự KHẢO SÁT! Một ví dụ từ tài liệu : "There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}.". Cảm ơn đã đề cập đến tài liệu tham khảo này.
Scott Rippey

@barjak Chỉ để xác thực quan điểm của tôi, mặc dù vậy, SmartFormat có nhiều tính năng hơn! Định dạng có điều kiện hoạt động cho bất kỳ loại dữ liệu nào, chẳng hạn như bool, ngày, thời gian và đối tượng; nó cũng hỗ trợ các nhà khai thác tiên tiến, chẳng hạn như "{Count:<0?negative|=5?five|>50&<100?large|other}". Nó có sự phản chiếu (nghĩa là "There are {items.Length} items"có thể định dạng các mục mảng và thời gian. Ngoài ra, nó có một mô hình plugin để hỗ trợ nhiều tính năng hơn nữa.
Scott Rippey

Nó có vẻ là mạnh mẽ, thực sự. Các định dạng mảng là can thiệp.
barjak

@barjak: Vâng, định dạng mảng thực sự hữu ích! Kiểm tra ví dụ này: Smart.Format("There are {0.Count} files: {0:'{}'|, |, and }.", files);sẽ dẫn đến "There are 3 files: 'a.txt', 'b.txt', and 'c.txt'.". Tôi không thể tưởng tượng "nội địa hóa" mà không có nó.
Scott Rippey

7

Kết hợp K (C #, Scala)

Tôi sử dụng bộ kết hợp K trong Ruby khá thường xuyên, chủ yếu là các nếp gấp khi thao tác gấp được thực hiện thông qua hiệu ứng phụ thay vì giá trị trả về, như trong ví dụ này:

some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1 }

Điều này tính tần suất mỗi phần tử xảy ra trong some_collection. Thật không may, nó không thực sự hoạt động, vì khối phải trả về giá trị mới của bộ tích lũy ở mỗi lần lặp, nhưng trong các bài tập Ruby đánh giá giá trị được gán.

Vì vậy, bạn phải hoàn toàn trả về giá trị mới của bộ tích lũy như thế này:

some_collection.reduce(Hash.new(0)) {|acc, el| acc[el] += 1; acc }

Nhưng tôi thấy trình tự rõ ràng như vậy xấu xí trong phong cách chức năng này bằng cách sử dụng các nếp gấp. Người kết hợp K (được gọi Object#taptrong Ruby) để giải cứu:

some_collection.reduce(Hash.new(0)) {|acc, el| acc.tap { acc[el] += 1 }}

Tôi đã bỏ lỡ nó một vài lần trong C # (chủ yếu là vì một số lý do đột biến bộ sưu tập như List.Addtrở lại voidthay vì this) và Scala, vì vậy tôi mang theo điều này:

namespace GenericExtensions
{
    public static class GenericExtensions
    {
        public static T Tap<T>(this T o, Action<T> f)
        {
            Contract.Requires(o != null);
            Contract.Requires(f != null);

            f(o);
            return o;
        }

        public static T Tap<T>(this T o, Action f)
        {
            Contract.Requires(o != null);
            Contract.Requires(f != null);

            f();
            return o;
        }
    }
}

và ở Scala:

class Tap[T](o: T) {
  def tap(f: T => Unit) = { f(o); o }
  def tap(f: => Unit) = { f; o }
}

object Implicits { implicit def any2Tap[T](o: T) = new Tap(o) }

Chức năng nhận dạng (Ruby)

Một cái gì đó tôi đang thiếu trong Ruby, là một cách được đặt tên độc đáo để truy cập chức năng nhận dạng. Haskell cung cấp chức năng nhận dạng dưới tên của id, Scala dưới tên của identity. Điều này cho phép một người viết mã như:

someCollection.groupBy(identity)

Tương đương trong Ruby là

some_collection.group_by {|x| x }

Không chính xác lăn lưỡi, phải không?

Cách khắc phục là

IDENTITY = -> x { x }

some_collection.group_by(&IDENTITY)

ForEach (.NET)

Một phương pháp cực kỳ thiếu khác trong C #:

namespace IEnumerableExtensions
{
    public static class IEnumerableExtensions
    {
        public static void ForEach<T>(this IEnumerable<T> xs, Action<T> f)
        {
            Contract.Requires(xs != null);
            Contract.Requires(f != null);

           foreach (var x in xs) f(x);
        }
    }
}

3
Tôi nghĩ rằng ví dụ cuối cùng của bạn là một quyết định thiết kế có tính toán. Khái niệm về một Actiontác dụng phụ ngụ ý các nguyên tắc thiết kế của LINQ.
ChaosPandion

1
@ChaosPandion: Điều này có liên quan gì đến LINQ?
Jörg W Mittag

@ Jörg W Mittag - Các IEnumerabletiện ích mở rộng đã được thêm cho LINQ.
ChaosPandion

2
@ChaosPandion: Tôi vẫn không hiểu. ForEachkhông phải là toán tử LINQ. Tại sao các hạn chế chỉ áp dụng cho các nhà khai thác LINQ áp dụng cho ForEach, đó không phải là nhà điều hành LINQ? Và tại sao các tác dụng phụ bị cấm IEnumerable.ForEachnhưng được phép List.ForEach? Ngoài ra, tại sao các tác dụng phụ bị cấm IEnumerable.ForEachnhưng được phép sử dụng foreach?
Jörg W Mittag

@ Jorg W Mittag - Điều tôi đang nói là thực tế là nó bị thiếu trong các phần mở rộng là một quyết định thiết kế. Thực tế List<T>có một ForEachhợp lý xem xét rằng nó là một loại đột biến.
ChaosPandion

6

Tôi có một Trình chuyển đổi kiểu Java. Nó có chữ ký công khai

public static <T> T convert(Object sourceValue, Class<T> destinationType)

và nó làm hết sức mình để chuyển đổi giá trị nguồn thành loại đích. Về cơ bản, nó cho phép bạn thực hiện gõ động trong một ngôn ngữ được nhập tĩnh :-)

Nó thực sự hữu ích với các loại số đóng hộp. Thật khó chịu khi bạn không thể đặt một Integernơi Longđược mong đợi? Không có vấn đề, chỉ cần chuyển đổi nó. Hoặc nếu chức năng của bạn mong đợi a double, nhưng bạn phải nullđặt ở đó thì sao? Kaboom, một NPE. Nhưng đặt nó qua convert, và bạn nhận được một NaN.


Giải pháp thú vị. Tôi luôn nghĩ rằng Long nên mở rộng Integer. Nhưng ngay cả sau đó bạn vẫn gặp vấn đề về hộp tự động (theo như tôi biết, không có cách nào hộp tự động sẽ hoạt động với tính kế thừa). Ngoài ra, +1 để được NaNhỗ trợ.
Nicole

NaNlà tuyệt vời. Thật tệ là không có những thứ như vậy cho số nguyên. Tôi đã sử dụng Integer.MIN_VALUEnhư một quy ước. Nó thường "đủ kỳ lạ" để được chú ý, không giống như giá trị mặc định 0. Tôi không biết tại sao quyền anh tự động (un) không được coi (Double) nullNaN. Đó là giải pháp đúng đắn rõ ràng, IMHO.
Joonas Pulakka

6

Trong số các mã linh tinh tôi đã viết, hầu hết các nội dung tốt đều có trong CCAN , trong khi phần còn lại tôi có xu hướng tìm các phiên bản tốt hơn trong các dự án nguồn mở hiện có. Ngày nay, tôi thấy mình viết mã "misc" ít mục đích chung hơn, ủng hộ việc viết các biến thể dành riêng cho ứng dụng của mã đó hoặc viết các mô-đun có mục đích chung mà tôi có thể tự phát hành.

C

Đây là một chức năng và typedef Tôi đã sử dụng nhiều lần. Đối với các ứng dụng cần thời gian, thật khó để đánh bại mili giây về mặt đơn giản:

#include <stdint.h>
#include <sys/time.h>

typedef int64_t msec_t;

static msec_t time_ms(void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return (msec_t)tv.tv_sec * 1000 + tv.tv_usec / 1000;
}

Và nhiều chức năng C linh tinh khác mà tôi có xu hướng sử dụng nhiều lần (và hơn):

/* Remove a trailing newline, if present. */
void chomp(char *buffer)
{
    if (!*buffer)
        return;

    while (*buffer)
        buffer++;

    if (buffer[-1] == '\n')
        buffer[-1] = 0;
}

/*
 * Skip whitespace, update the pointer, and return it.
 * Example:
 *
 * switch (*skipSpace(&s)) {
 *     case '\0':
 *         ...
 *     case '(':
 *         ...
 */
const char *skipSpace(const char **sptr)
{
    const char *s = *sptr;
    while (isspace(*s))
        s++;
    *sptr = s;
    return s;
}

/* Scramble an array of items uniformly. */
void scramble(void *base, size_t nmemb, size_t size)
{
    char *i = base;
    char *o;
    size_t sd;
    for (;nmemb>1;nmemb--) {
        o = i + size*(rand()%nmemb);
        for (sd=size;sd--;) {
            char tmp = *o;
            *o++ = *i;
            *i++ = tmp;
        }
    }
}

Haskell

Haskell nub :: (Eq a) => [a] -> [a]Hàm là O (n²) bởi vì, bằng chữ ký loại của nó, nó chỉ được phép kiểm tra nếu hai phần tử bằng nhau. Một thay thế O (n log n) đơn giản là map head . group . sort, nhưng nó yêu cầu buộc toàn bộ danh sách đầu vào trước khi tạo đầu ra, trong khi nubcó thể bắt đầu sản xuất đầu ra ngay lập tức. Sau đây là một thay thế O (n log n) để nubthu thập các mục đã thấy trong Data.Set:

module Nub (nub') where

import Prelude
import Data.Set (empty, member, insert)

nub' :: Ord a => [a] -> [a]
nub' xs = loop xs empty where
    loop [] _ = []
    loop (x:xs) set =
        if x `member` set
            then loop xs set
            else x : loop xs (insert x set)

Trong Haskell, tôi sử dụng các lựa chọn thay thế cho sequence,mapM , forM, replicateM, và filterM. Mỗi hành động này tạo ra một danh sách, nhưng danh sách không thể được sử dụng cho đến khi hành động hoàn thành toàn bộ (nếu bạn đang sử dụng một đơn nguyên nghiêm ngặt như IO). Các lựa chọn thay thế xây dựng danh sách ngược lại thay vì tạo thành một tháp thunks, mà tôi thấy thông qua điểm chuẩn là nhanh hơn, ít nhất là với GHC.

sequence' :: Monad m => [m a] -> m [a]
sequence' ms = loop ms [] >>= return . reverse where
    loop []     xs = return xs
    loop (m:ms) xs = do
        x <- m
        loop ms (x:xs)

mapM' :: Monad m => (a -> m b) -> [a] -> m [b]
mapM' f xs = sequence' $ map f xs

forM' :: Monad m => [a] -> (a -> m b) -> m [b]
forM' = flip mapM'

replicateM' :: Monad m => Int -> m a -> m [a]
replicateM' n x = sequence' (replicate n x)

filterM' :: Monad m => (a -> m Bool) -> [a] -> m [a]
filterM' pred xs = loop xs [] >>= return . reverse where
    loop []     xs' = return xs'
    loop (x:xs) xs' = do
        keep <- pred x
        loop xs (if keep then (x:xs') else xs')

Lưu ý: sequence_, mapM_, forM_, vàreplicateM_ các chức năng vẫn là một lựa chọn tốt hơn nếu bạn không quan tâm đến danh sách kết quả.


+1 cho CCAN, mặc dù tôi có thể bị coi là hơi thiên vị :)
Tim Post

4

Tôi kết thúc việc thực hiện chia / tham gia ala Perl bằng các ngôn ngữ không có nó.

Tôi cũng đã thực hiện lại atoi và itoa trong C nhiều lần hơn tôi muốn nghĩ (hệ thống nhúng rác).


4

Không.

Tôi thực hiện hầu hết mã hóa của mình bằng Java và cách tốt nhất là sử dụng lại "các tiện ích" từ các thư viện Apache Commons và các dự án tương tự.

Nếu bạn khách quan về nó, có vài trường hợp bộ sưu tập "đồ dùng" của riêng bạn sẽ là một cải tiến đáng kể về những gì người khác đã làm. Và nếu nó không phải là một cải tiến, thì thư viện utils của bạn có thể là một sự lãng phí thời gian phát triển và gây phiền toái / gánh nặng cho những người duy trì trong tương lai.


3

Tôi đã có một số thao tác ngày mà tôi đã thực hiện bằng Java, sau đó tôi bắt đầu sử dụng JodaTime vì tôi đã nghe thấy những điều hay về nó và nó được đưa vào Java 7 (không chắc đây có phải là trường hợp không, nhưng ngay cả khi nó không phải là nó cũng đáng sử dụng nó imho).

Nó biến một lớp 50+ thành một dòng với khoảng ba lệnh gọi phương thức được xâu chuỗi.

Đối với sự tò mò, nó liên quan đến việc lấy ngày cho mỗi ngày của n tuần qua: ví dụ: số liệu bán hàng cho một ngày thứ hai 10 tuần trước, v.v.).

Và đây là một phần của nó

public static DateTime getDayPreviousWeek(DateTime dt, DayOfWeek dayOfWeek, int n_weeks) {
       return dt.minusWeeks(n_weeks).dayOfWeek().setCopy(dayOfWeek.getDayAsString());
}

java có phương thức mở rộng?
Kugel

Không, nhưng tôi nghĩ rằng nó có thể nhận được chúng trong phiên bản 7
NimChimpsky

2

Tôi luôn có một utils gói nào đó, ngay cả trong Java, nhưng bộ sưu tập các tiện ích PHP của tôi được sử dụng lại nhiều nhất. Có rất nhiều thư viện tốt trong Java, đến nỗi tôi đã có sẵn một thư viện trong dự án hoặc chỉ cần tự mình thiết kế một vài tiện ích còn thiếu. Các thư viện PHP có xu hướng làm quá nhiều để tôi muốn đưa chúng vào các dự án của mình.

Tôi rất thích chức năng này cho PHP, được tinh chỉnh với sự trợ giúp trên StackOverflow ...

function getValueFromDotKey(&$context, $name) {
    $pieces = explode('.', $name);
    foreach ($pieces as $piece) {
        if (!is_array($context) || !array_key_exists($piece, $context)) {
            // error occurred
            return null;
        }
        $context = &$context[$piece];
    }
    return $context;
}

Nó tương tự như BeanUtils của Java cho Java và tôi sử dụng nó cho mục đích tương tự, cung cấp cho các phần tử biểu mẫu trong ngôn ngữ mẫu một khóa duy nhất có thể nhận / đặt giá trị lồng nhau trong một mảng nguồn:

$source = array('a' => array('b' => 5));

$val = getValueFromDotKey($source, 'a.b');

Tất nhiên, là PHP, tôi muốn giữ phương thức này nhẹ nhất có thể để nó không quá đặc trưng như BeanUtils;)


2

Thư viện tiêu chuẩn Scala thiếu một số chức năng bậc cao được sử dụng phổ biến nhất.

Hai chức năng như vậy mà tôi cần thường xuyên nhất:

// #1: unfold
def unfold[T, R](init: T)(f: T => Option[(R, T)]): List[R] = f(init) match {
  case None => Nil
  case Some(r, v) => r :: unfold(v)(f)
}

// #2: zipWith
def zipWith[A, B, C](xs: List[A], ys: List[B])(f: (A, B) => C): List[C] = {
  (xs, ys).zipped.map(f)
}

1

Hiện tại, không. Tôi đã có một cái khi tôi đang làm C, nhưng bây giờ tôi làm Java, nó không còn ý nghĩa nữa, xem xét tất cả các lib tiêu chuẩn có sẵn, cộng với tất cả các tính năng đến từ dự án Apache.

Một trong những điều hữu ích trong C lib của tôi là triển khai máy trạng thái hữu hạn nhanh & bẩn, cho phép định nghĩa máy trạng thái hữu hạn chỉ với hai chuỗi và một chuỗi chuỗi. Nó có thể được sử dụng để kiểm tra các chuỗi theo quy tắc (ví dụ: "phải dài 4.,6 ký tự, đầu tiên là một chữ cái, các chữ số còn lại"), nhưng sự sẵn có của các biểu thức chính khiến điều đó trở nên hoàn toàn vô nghĩa.


1

Bây giờ tôi không thể viết UI máy tính để bàn mà không có hộp thoại động , dựa trên thực thi vi sai . Đó là một vụ hack mà tôi đã vấp ngã vào khoảng năm 1985 và tôi đã thực hiện lại nó bằng nhiều ngôn ngữ nhiều lần hơn tôi có thể nhớ.


1

Tôi thấy rằng tôi đã viết rất nhiều mã giống nhau trong django, Làm điều phổ biến này, sau đó là điều phổ biến, và cuối cùng là điều phổ biến. Về cơ bản có được một hoặc nhiều mục từ cơ sở dữ liệu hoặc lưu kết quả của biểu mẫu.

Nếu Mỗi một trong những điều này xảy ra chỉ một lần trong một chế độ xem, thì tôi có thể sử dụng các chế độ xem chung django. Thật không may, những thứ đó không thực sự có thể ghép lại được và tôi cần phải làm một vài thứ theo trình tự.

Vì vậy, tôi đã đi và viết một thư viện khung nhìn thậm chí còn chung chung hơn, một thư viện hoạt động bằng cách đầu tiên xây dựng một danh sách các hành động từ các truy vấn có liên quan (hoặc bất cứ điều gì), sau đó gói danh sách vào dạng xem.

Tôi vẫn phải viết một số quan điểm bằng tay, nhưng những điều này thường đủ phức tạp để không có nhiều thứ có thể tái sử dụng trong đó. Tất cả các mẫu nồi chỉ hạ cánh ở nơi khác, hoặc là một khung nhìn chung hoặc như một trang trí xem (thường là một khung nhìn chung được trang trí). Điều này thường kết thúc là khoảng 10% trình xử lý tôi viết, vì một số trình xử lý chung có thể làm mọi thứ khác.


1

Có, nhưng chỉ dành cho các cấu trúc thành ngữ dành riêng cho miền (như các thùng chứa dành riêng cho đối tượng trò chơi).

Vì nó là công cụ tiện ích đơn giản hơn bất kỳ thứ gì phức tạp, tôi không tự hào về bất cứ thứ gì ở đó. Dù sao tôi cũng là người dùng duy nhất nên không có gì đáng tự hào.


1

Sắp xếp gián tiếp C ++, dựa trên mẫu STL sortvà mẫu functor.

Nhu cầu sắp xếp gián tiếp (trong đó đầu ra mong muốn là các chỉ số hoán vị sẽ dẫn đến việc sắp xếp dữ liệu, nhưng không phải là dữ liệu được sắp xếp ) xuất hiện nhiều lần trong một số dự án. Tôi luôn tự hỏi tại sao STL không cung cấp triển khai cho nó.

Một cái khác là một vectơ tuần hoàn C ++, trong đó các chỉ số dương và âm là modulo với kích thước vectơ (sao cho mọi giá trị nguyên là chỉ mục hợp lệ cho vectơ).


-4

Tôi đã viết một gói utils nhỏ khi tôi đang thực hiện phát triển Java trong Comp. Lớp học Sci ở trường trung học. Tôi tự hào nhất về trình tạo số ngẫu nhiên của mình.

/**
* Returns a random integer.
*
* @returns    int    Random integer
*/
public static int getRandom()
{
    return 4; // Chosen by a fair dice roll.
              // Guaranteed to be random.
}

Đạo cụ theo cảm hứng của tôi.


12
c'mon, xkcd ....
Darknight

2
Thôi nào, không sao đâu.
Josh K

1
Với số phiếu hiện tại của bạn là -2, tôi đoán nó thực sự quan trọng ...
user7676

8
Đạo văn là hình thức nịnh hót cao nhất, trừ khi nó rõ ràng.
Tối đa

5
Nút downvote nói: "Câu trả lời này không hữu ích". Tôi đoán cần có một nút quảng cáo: "... nhưng chắc chắn là buồn cười"
skajfes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.