小编JeJ*_*eJo的帖子

使用{a,b,c}作为参数或{a,b,c}实际执行的构造函数

我知道,我可以像这样初始化数据.

int array[3] = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

甚至

int array[2][2] = { {1, 2}, {3, 4} };
Run Code Online (Sandbox Code Playgroud)

我也可以这样做 std::vector

std::vector<int> A = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

假设我想写自己的课程:

class my_class
{
     std::vector< int > A;
     public:
     //pseudo code
           my_class(*x) { store x in A;} //with x={ {1, 2}, {3, 4} }
     // do something
};
Run Code Online (Sandbox Code Playgroud)

是否可以编写这样的构造函数,它是如何可能的?这是什么声明

{{1, 2}, {3, 4}} 实际上在做.

我总是发现,你可以用这种方式初始化数据,但绝不是它正在做的事情.

c++ constructor class c++11 stdinitializerlist

6
推荐指数
1
解决办法
208
查看次数

std::transform 以两个 std::vector 和一个常量作为参数

我想使用 std::transform 做一些类似于 binary_op 的事情,但有一个附加常量,例如,获得两个向量的乘积: x1 = (10,20,30,40,50) 和 x2 = (2, 4,6,8,10),我们可以写:

#include <iostream>
#include <algorithm>
#include <vector>


double multiply(double x, double y){
    return x*y;
}

int main () {
  std::vector<int> x1;
  std::vector<int> x2;


  for (int i=1; i<6; i++)
    x1.push_back (i*10); //10,20,30,40,50

  for (int i=1; i<6; i++)
    x2.push_back (i*2);  //2,4,6,8,10



  std::transform (x1.begin(), x1.end(), x2.begin(), x1.begin(),multiply);


  for (std::vector<int>::iterator it=x1.begin(); it!=x1.end(); ++it)
    std::cout << ' ' << *it;
  //output: 20,80,180,320,500

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码将 x1 和 x2 按元素相乘并返回 (20,80,180,320,500)。

但是,如果我想计算 x1 …

c++ lambda transform stdvector c++11

6
推荐指数
1
解决办法
7851
查看次数

为什么我不能将 operator[] 用于 std::unordered_map&lt;std::pair&lt;int,int&gt;, int&gt; 而是用于相同的“std::map”键值对?

#include <bits/stdc++.h>

std::unordered_map<std::pair<int,int>, int> mp;

int main()
{
    mp[make_pair(1, 2)]++;
}
Run Code Online (Sandbox Code Playgroud)

使用时[] operator,我得到了这个

error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::pair<int, int>, int>’ and ‘std::pair<int, int>’)
Run Code Online (Sandbox Code Playgroud)

但是,当用 做同样的事情时std::map,不会发生错误。为什么?

我怎样才能让它工作std::unorderd_m

c++ unordered-map c++-standard-library c++11 std-pair

6
推荐指数
1
解决办法
1562
查看次数

如何编写可以接收数组或向量的函数?

我想编写一个带有一个参数的C++函数,以便可以传入以下任何一种类型:

std::vector<int>
std::array<int>
int array[numElements]
int *ptr = new int[numElements]
etc
Run Code Online (Sandbox Code Playgroud)

模板是实现这一目标的最佳方式吗?

c++ arrays templates function stdvector

6
推荐指数
2
解决办法
461
查看次数

如何在类的构造函数中定义成员向量的大小?

我想先制作一个没有大小(vector<int> times)的向量,然后再在类()的构造函数中定义其大小times(size)

我可以通过使用初始化器列表来做到这一点,如下所示

class A (int size): times(size) {};
Run Code Online (Sandbox Code Playgroud)

但是我的问题是,为什么不能在类似于以下代码的类的构造函数中执行此操作?

我的意思是为什么下面的代码是错误的?

class A
{
public:
    A(int size);
private:
    std::vector<int> line;
};

A::A(int size)
{
    line(size);// here I got the error
}
Run Code Online (Sandbox Code Playgroud)

line(size) 犯错误

c++ constructor class stdvector c++11

6
推荐指数
1
解决办法
118
查看次数

#ifdef _DEBUG在主要功能中

请问#ifdef _DEBUG在主要功能有任何意义,如果我在工作的Visual Studio 2013

如果是,那是为了什么?

int _tmain(int argc, _TCHAR* argv[])
{
#ifdef _DEBUG

//creating some objects, using  functions etc;

#endif
}
Run Code Online (Sandbox Code Playgroud)

c++ macros visual-studio visual-studio-debugging

5
推荐指数
1
解决办法
2431
查看次数

为什么擦除删除习语不适用于反向迭代器

我的目标是尝试解决这个问题:从 end 中删除向量中的所有空元素。使用擦除删除成语。

这个想法是在给定std::vector<std::string>的字符串a中删除从末尾开始的所有元素,这些元素是空的(等于空白)。当发现非空元素时,应停止删除元素。

例子:

vec = { " ", "B", " ", "D", "E", " ", " ", " " };
Run Code Online (Sandbox Code Playgroud)

移除后:

vec = { " ", "B", " ", "D", "E"};
Run Code Online (Sandbox Code Playgroud)

这是我尝试的解决方案:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

int main()
{
    std::vector<std::string> vec = { " ", "B", " ", "D", "E", " ", " ", " " };

    bool notStop = true;
    auto removeSpaceFromLast = [&](const std::string& …
Run Code Online (Sandbox Code Playgroud)

c++ base stdvector erase-remove-idiom stl-algorithm

5
推荐指数
1
解决办法
682
查看次数

如何使此函数使用getline读取字符串并使用int执行相同的操作?

template<typename T>
T get(const string &prompt)
{
    cout<<prompt;
    T ret;
    cin>>ret;
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何通过重载来做到这一点; 基本上,这适用于任何类型的数据,对......

我尝试了typeid(variable).name();并获得了一个字符串变量的输出,并尝试在get函数中创建一个if.但它没有用.

c++ string templates overloading getline

5
推荐指数
1
解决办法
102
查看次数

如何判断一个对象是否有堆分配成员?

有没有一种方法可以确定一个对象在堆上是否至少有一个成员?

我试图能够将像std::stringor std::vectoror这样的对象std::list(是的,主要是容器)与所有其他类型区分开来(不幸的是,即使是具有单个元素的容器也在我的“感兴趣范围”内)

我正在尝试做类似以下的事情:

struct foo
{
private:
    int * _ptr;

public:
    foo() : _ptr(new int) {};
    ~foo() { delete _ptr; };
};

struct bar
{
private:
    int val;
};

template <typename T>
void func(T val)
{
    if constexpr (std::is_class_v<T>)
    {
        std::cout << std::setw(20) << typeid(T).name() << " is a class type." << std::endl;
        if (/* determine if foo has any heap allocations */)
        {
            // Do something #1.
            std::cout << std::setw(20) << typeid(T).name() << …
Run Code Online (Sandbox Code Playgroud)

c++ templates class member c++17

5
推荐指数
1
解决办法
901
查看次数

我无法通过参考捕获传递lambda

以下代码因此错误而失败

E0413不存在从“ lambda [] float(int i)-> float”到“ float(*)(int i)”的合适转换函数

int test;   
float (*f)(int i) = [&](int i) -> float {return test; };
Run Code Online (Sandbox Code Playgroud)

我该如何解决?我需要Capture子句。

c++ lambda function-pointers function c++11

5
推荐指数
1
解决办法
127
查看次数