标签: stdvector

我如何为 c++ 向量赋值

我知道我可以像这样初始化一个向量:

vector<int> v{1,3,4,6};
Run Code Online (Sandbox Code Playgroud)

但是,当我定义一个包含向量的类时,我无法在我声明它的位置初始化它,如下所示:

class C {
  public: 
    vector<int> v; 
    C();
};
Run Code Online (Sandbox Code Playgroud)

因此我需要在构造函数中初始化它。以下代码有效,但不干净:

C::C() {
    v.resize(4); 
    v[0]=1; 
    v[1]=3; 
    v[2]=4; 
    v[3]=6;
}
Run Code Online (Sandbox Code Playgroud)

我怎么能像初始化一样整齐直接地初始化它,vector<int> v{1,3,4,6};而不是一个一个地赋值?

编辑:也许我没有把我的情况说清楚。{1,3,4 6} 的值可能不是预定义的值,它们取决于一些逻辑和条件:if(condition_a) {v[0] = 0; v[1]=3; ...} else {v[0]=4;v[0]=8;...}. 因此,我必须处理其他一些事情才能知道如何初始化这个向量,所以我不能按照某些答案中的建议使用初始化列表。请问有什么建议吗?

c++ vector stdvector c++11

1
推荐指数
2
解决办法
1668
查看次数

以向量为键的 C++ 映射。如何使它如此矢量顺序无关紧要?

我有一个以整数向量为键的地图。我用值的关键向量初始化地图{1, 2, 3}

typedef std::map<std::vector<int>, std::string> VectorMap;
VectorMap vectorMap;
vectorMap[std::vector<int>{1, 2, 3}] = "test";
Run Code Online (Sandbox Code Playgroud)

然后我使用count方法来显示是否可以通过向量{1, 2, 3}作为关键字找到VectorMap中的条目。

std::cout << "count: " << vectorMap.count(std::vector<int>{1, 2, 3}) << std::endl;
Run Code Online (Sandbox Code Playgroud)

这将返回正确的计数。

数:1

但是我想这样做,所以向量中整数的顺序无关紧要。所以我尝试与上述相同但矢量内容翻转即{3, 2, 1}

std::cout << "count: " << vectorMap.count(std::vector<int>{3, 2, 1}) << std::endl;
Run Code Online (Sandbox Code Playgroud)

这将返回 0 的计数。

计数:0

我想让矢量比较与内容的顺序无关,只要内容相同。

{1, 2, 3} count: 1
{3, 2, 1} count: 1
{1, 2} count: 0
{1, 2, 3, 4} count : 0
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我应该完全使用不同的容器而不是 std::vector 吗?

c++ containers stdmap stdvector unordered

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

对 std::vector 使用嵌套 [ ] 操作

我对 C++ 很陌生,我曾尝试寻找这个问题的答案并运行测试,但很多时候我无法弄清楚是什么导致了特定行为。我的问题与使用嵌套[ ]运算符访问或修改循环中的元素有关 - 例如:

//Declare

std::vector<int> a1 {10,20,30,40} ;
std::vector<int> a2 {2,3} ;
int S2 = a2.size() ; 

//Loop
for(int i = 0 ; i < S2 ; i++){
         a1[a2[i]] = a1[a2[i]] + 5000 ;
}
Run Code Online (Sandbox Code Playgroud)

这被认为可以吗?我不仅要问一般做法,还要问效率和我需要考虑的任何其他潜在因素。我是否应该首先存储a[i]在循环内的临时变量中,然后使用它来修改 vector 中的元素a2?

我确实知道它可能不是最好的结构,我应该使用其他一些数据结构来做这种事情,但我只想了解这是否可以或者是否可能导致一些未定义的行为。

c++ std stdvector

1
推荐指数
2
解决办法
76
查看次数

为什么 operator[] 是为 const std::vector 定义的,而不是为 const std::map 定义的?

有这个代码:

#include <map>
#include <string>
#include <vector>

void foo1(const std::map<std::string, int> &m)
{
    m["abcd"];
}

void foo2(const std::vector<std::vector<int>> &v)
{
    v[0];
}
Run Code Online (Sandbox Code Playgroud)

只给出错误foo1,但不给出错误foo2。据我了解map-> 它有 2 个数组 - 一个用于键,第二个用于值。我明白 aconst map给了我const int作为价值。但也应该如此vector<vector<int>>,因为访问元素 via[]也是const vector<int>,但被允许。此外,通过访问值[]并不立即意味着我想要write一个数据。我只能读取那个值,那为什么甚至const map没有operator[]?(当编译器不知道我是想写还是读时)。

编辑

问题在于语言设计,而不是标准报价。正如在评论中一样 -> 你需要 1 个操作符来写 map operator[]。但是需要 2 个运算符来进行向量写入operator[], operator=。为什么map::operator[]自动期望我要写?(因此通过提供的键创建新元素)?我可以像在 vector 中一样只是尝试从该映射中读取,如果该键(对)不存在,它会给出错误或警告,但无需立即创建它。

c++ language-design stdmap stdvector c++-standard-library

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

向量和函数练习

我有一个关于这个程序的问题。我是编程和 C++ 的初学者,我试图弄清楚两件事。

  1. 为什么这个程序没有编译(错误:使用未初始化的内存“总计” - 我将它定义为一个变量??)。

  2. 有人能解释一下 main ( sumUpTo)之外的函数是如何工作的吗?具体& vec和total,因为我从来没有见过他们。谢谢。

/* 1) read in numbers from user input, into vector    -DONE
    2) Include a prompt for user to choose to stop inputting numbers - DONE
    3) ask user how many nums they want to sum from vector -
    4) print the sum of the first (e.g. 3 if user chooses) elements in vector.*/

#include <iostream>
#include <string>
#include <vector>
#include <numeric> //for accumulate

int …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector c++-standard-library

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

std::vector 用最后一个迭代器擦除

擦除第一个迭代器在最后一个迭代器之后的范围时会发生什么?

std::vector<int> v{1,2};

v.erase(
    v.begin() + 1,
    v.begin()
);
Run Code Online (Sandbox Code Playgroud)

其他容器呢?

c++ iterator range stdvector c++-standard-library

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

如何填充和编辑 std::array 地图

我有一组地图:

std::array<std::map<double, double>, 8> freqMap;
Run Code Online (Sandbox Code Playgroud)

填充它时,我需要在不同的数组索引处向地图添加条目。我知道我可以创建 8 个不同的地图,填充它们,然后将它们添加到数组中,但是是否可以直接在数组中将条目附加到地图?

例如,我如何将着手添加的映射条目key5.0,val3.3至数组索引2,然后添加另一条目数组索引3,然后附加另一条目索引2再次等。

我也可以使用std::vector地图,但仍然看不到以这种方式添加条目的方法。

这是一个例子。我正在从文件中读取数据并想直接更新我的数据结构:

while (fin >> arrayIdx >> key>> val)
    freqMaps[arrayIdx] = ??
Run Code Online (Sandbox Code Playgroud)

c++ arrays stdmap stdvector stdarray

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

如何基于 .first 值从 std::pair 的 std::vector 中删除元素?

好的,所以我有一个排序的std::vector<std::pair<int,double>>. 我似乎无法找到的是如何根据 std::pair (int) 的“第一个”元素的值从向量中删除条目。我可能会在我的算法中多次执行此操作,因此我不想每次都遍历向量(其中可能包含多达一百万个条目)。我知道我们可以使用 std::erase 或 remove 轻松删除基于索引的元素,但是有没有办法根据对的第一个元素的值来执行此操作?或者我们可以获取该元素的索引然后使用 std::erase 吗?

注意: std::pair 的第一个元素的值对于向量是唯一的。鉴于程序的限制,我需要使用向量(即不能使用地图或不同的容器)。

示例:我有一个容器:

std::vector<std::pair<int,double>> vec = { {20, 60.3}, ... {10, -20.2}, {1020, -80.9}};
Run Code Online (Sandbox Code Playgroud)

我想从向量中快速删除第一个元素 == 10 的元素,但我不知道它位于向量的哪个索引处。

c++ stdvector std-pair

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

有没有办法在 C++ 中将 std::string 转换为 vector&lt;char&gt; ?

有没有一种简单的方法可以将 std::string 转换为 std::vector 我想让用户输入任何长度的字符串,然后有一个动态字符数组(向量)。

#include<iostream>
#include<vector>
#include<string>



int main() {
    std::vector<char> word;
    std::string strWord;
    std::getline(std::cin, strWord);
    //What comes next? 
}
Run Code Online (Sandbox Code Playgroud)

我尝试过但不起作用的一件事是: strcpy(word, strWord); 我收到错误消息,没有从“std::string”到“const char*”的合适转换存在。因此,由于“word”是指向 char 数组的指针,我该如何添加字符串?

c++ type-conversion stdstring stdvector

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

C++:从 vector&lt;byte&gt; 的任何地方获取 int

我够大

std::vector<byte> source
Run Code Online (Sandbox Code Playgroud)

我需要从向量中的任何偏移量中获取四个字节(例如,10-13 个字节)并将其转换为整数。

int ByteVector2Int(std::vector &source, int offset)
{
return (source[offset] | source[offset + 1] << 8 | source[offset + 2] << 16 | source[offset + 3] << 24);
}
Run Code Online (Sandbox Code Playgroud)

这种方法太冒犯了,我如何才能以最大的性能做到这一点?

c++ stdvector

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