STL C++ контейнерная и оперативная конструкция

Рассмотрите следующее:

class CMyClass
{
public:
  CMyClass()
  {
    printf( "Constructor\n" );
  }
  CMyClass( const CMyClass& )
  {
    printf( "Copy constructor\n" );
  }
};

int main()
{
  std::list<CMyClass> listMyClass;

  listMyClass.resize( 1 );

  return 0;
}

Это производит следующий вывод:

Конструктор

Конструктор копии

Теперь мой вопрос: Как я избегаю конструктора копии? Или помещать его в другом отношении: Как я могу создать объекты в контейнере STL без ненужной операции копии. Там некоторый путь состоит в том, чтобы сделать "оперативную" конструкцию с помощью конструктора по умолчанию?


Обновление - отвечает до сих пор:

  1. Это не может быть сделано
  2. Используйте указатели или интеллектуальные указатели вместо этого.

Интеллектуальные указатели являются излишеством для моего приложения. Но я действительно задаюсь вопросом, почему это не может быть сделано. Это походит на такую очевидную вещь хотеть сделать. Какие-либо другие идеи? Я даже приму противный взлом, если он будет работать...


Решение

Я думаю, что просто нашел решение для своей проблемы из всех комментариев и ответов изложенным здесь. Решение состоит в том, чтобы создать пустой объект и иметь в наличии его для единственной цели использовать его позже для того, чтобы сделать чистые копии. Тогда можно использовать один из методов, которые берут ссылку (как push_back, или вставьте). Это все еще называет конструктора копии для каждого нового объекта введенным, но по крайней мере это не оба конструктор конструктора по умолчанию И копии:

int main()
{
  CMyClass Empty;

  std::list<CMyClass> listMyClass;

  for ( int c=0; c<10; ++c )
  {
    listMyClass.push_back( Empty );
  }

  return 0;
}
7
задан Barnett 20 January 2010 в 12:20
поделиться

4 ответа

Для данного конкретного случая «Просто» . В общем

let Just k = x in f k + 2 == 4

Этот трюк работает с любым конструктором типа данных и часто используется с (:) для непустых списков.

-121--2757021-

Я не уверен, что это проблема. Отправка электронной почты - это не очень дорогая операция - она просто сообщает SMTP-серверу, что почта должна быть отправлена, и SMTP-сервер заботится оттуда.

Тем не менее, вы можете попробовать:

new Thread(new Runnable() {
    public void run() {
        MailUtility.send(inviteeUser.getUserEmailAddress().trim(),
            "vagarwal@q3tech.com", "add friend message", Utility
                    .getAddFriendMessageBody(LoginHelper
                            .getLoggedInUserEmail()), false);
    }
}).start();
-121--3229703-

Все контейнеры стандартной библиотеки C++ хранят копии. Поэтому нельзя избежать вызова конструктора копирования, если требуется сохранить значения в контейнере - единственным выходом является сохранение указателей. Если требуется уменьшить накладные расходы на копирование, изучите использование ссылочного подсчета.

8
ответ дан 2 September 2019 в 02:43
поделиться

Использование указателей

std::list<CMyClass*> listMyClass;
1
ответ дан 2 September 2019 в 02:43
поделиться

Извините, в настоящее время не со СТД :: Список и аналогичные контейнеры. (Но вы можете написать свой собственный чуть-разный контейнер, если вам действительно нужно это, и все еще следуйте за остальной частью интерфейса STL.)

Вам не нужно использовать CTO по умолчанию, однако:

std::list<CMyClass> listMyClass;
listMyClass.resize(1, obj_to_copy_from);

, например:

std::list<CMyClass> listMyClass;
listMyClass.resize(1, CMyClass(use, specific, ctor));

Размеры выглядят следующим образом:

void list<T>::resize(size_type new_size, T copy_from = T());

, который создает новый объект (используя CTOR по умолчанию) по умолчанию.

1
ответ дан 2 September 2019 в 02:43
поделиться

Несмотря на отсутствие переносимого # define или чего-то, на что можно положиться, платформы обеспечивают стандартные функции для преобразования в «host» endian и от него.

Как правило, вы выполняете место хранения - на диск, или сеть - используя «network endian», который является BIG endian, и локальные вычисления с использованием host endian (который на x86 является LITTLE endian). Для преобразования между ними используются htons () и ntohs () и друзья.

-121--730637-

Попробуйте:

#include<stdio.h>        
int x=1;
#define TEST (*(char*)&(x)==1)?printf("little endian"):printf("Big endian")
int main()
{

   TEST;
}
-121--730635-

используйте указатель или смарт-указатель (boost::shared_ptr, а не auto_ptr)

0
ответ дан 2 September 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: