2013-05-28 5 views
-2

Мне любопытно, как наиболее распространенный эквивалент C++ для .NET-списка <>? Есть много библиотек, и я не уверен, какие из них имеют лучшие характеристики производительности.C++ эквивалент .NET-списка <>?

Вот .NET код, который показывает список <>:

List<double> x = new List<double> {1}; 
x.Add(2); 
Console.WriteLine("{0},{1}",x[0], x[1]); 
+2

Предлагаю вам искать [справочный сайт] (http://en.cppreference.com/w/cpp). –

+0

@Joachim Pileborg Спасибо. Существует так много библиотек, что трудно понять, с чего начать. – Contango

+5

@Gravitas: есть только одна [стандартная библиотека для C++] (http://www.sgi.com/tech/stl/), о которой я знаю, и только одна [дополнительная библиотека, о которой когда-либо говорили] (http://www.boost.org/). Быстрый поиск библиотек C++ показывает этот факт. – user7116

ответ

10

Если у вас есть основания для выбора иначе, стандартный контейнер, который вы должны принять по умолчанию является std::vector (который, кстати, , эквивалент контейнера List<> .NET).

std::vector выделяет свой элемент в смежной области хранения, что делает операции быстрее из-за более высокой скорости попадания в кеш. Это обычно доминирует влияние линейной вычислительной сложности на операции, такие как вставки и абсорбции в середине контейнера:

#include <vector> // <== Necessary for std::vector 
#include <iostream> // <== Necessary for overloads of operator << and std::cout 

std::vector<int> temp = { 1 }; 
temp.push_back(42); 
std::cout << temp[0] << "," << temp[1]; 

Вот live example.

Для получения дополнительной технической информации о том, почему std::vector должен быть вашим выбором по умолчанию для контейнера, см. this paper by Bjarne Stroustrup.

+2

+1 для 'std :: vector' над' std :: list' в общем случае. – Steve

+0

@juanchopanza: Технически да. Но, тем не менее, vecotr имеет лучшую производительность в большинстве случаев использования. Идиома должна всегда использовать std :: vector и использовать только что-то другое, если есть веские основания для этого. Таким образом, логически std :: vector является эквивалентом списка C# с логической точки зрения. – Skalli

+0

Я не думаю, что в моем (удаленном) комментарии есть что-то, что противоречит тому, что вы говорите. – juanchopanza

3

Вы можете использовать vector следующим образом:

#include <vector> 

using namespace std; 
vector<double> v; 
v.push_back(12); 
6

Точный эквивалент станд :: вектор <>. Точные же перцепционные характеристики, только экспоненциальный алгоритм отсрочки роста для изменения базового массива несколько отличается. Common std :: vector <> Реализация способствует расширению массива на x1.5, .NET-коллекции растут на x2.

Обратите внимание, что это не станд :: Список <>, эквивалент для этого один в .NET является LinkedList <>. Лучше всего избегать, у него очень низкая локальность.

Смежные вопросы